/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Ui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.font.TextAttribute;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.NumberFormat;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import java.util.regex.PatternSyntaxException;
import javax.swing.JOptionPane;
import javax.swing.RowFilter;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author Esteban
 */
public class VentanaModuloAdministrador extends javax.swing.JFrame implements Observer{

    private String userActual;
    /**
     * Creates new form VentanaModuloEstudianteEstandar
     */
    public VentanaModuloAdministrador() {
        initComponents();
        initComponents2();
        initComponents3();
        initComponents4();
        initComponents5();
    } 

    public void setUserActual(String actual){
        cerrarSesion.setText(actual);
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        grupoTipoMonto = new javax.swing.ButtonGroup();
        panelImagenEstudiante = new org.edisoncor.gui.panel.PanelImage();
        version = new javax.swing.JLabel();
        modulo = new javax.swing.JLabel();
        perfil = new javax.swing.JLabel();
        usuario = new javax.swing.JLabel();
        registrado = new javax.swing.JLabel();
        cerrarSesion = new javax.swing.JLabel();
        panelImagenEstudiante2 = new org.edisoncor.gui.panel.PanelImage();
        panelOpciones = new javax.swing.JTabbedPane();
        panelUsuarios = new javax.swing.JPanel();
        manejoUsuarios = new javax.swing.JPanel();
        id = new javax.swing.JLabel();
        contrasena = new javax.swing.JLabel();
        roles = new javax.swing.JLabel();
        rolAdmin = new javax.swing.JRadioButton();
        rolEstandar = new javax.swing.JRadioButton();
        imgUsuario = new javax.swing.JLabel();
        btnNuevo = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        btnBusqueda = new javax.swing.JButton();
        btnActualizar = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        nuevaContrasena = new javax.swing.JLabel();
        campoNuevaContrasena = new javax.swing.JPasswordField();
        campoContrasena = new javax.swing.JPasswordField();
        btnAgregar = new javax.swing.JButton();
        edicion = new javax.swing.JLabel();
        campoId = new javax.swing.JTextField();
        astUsuario = new javax.swing.JLabel();
        astContrasena = new javax.swing.JLabel();
        astNuevaContrasena = new javax.swing.JLabel();
        astRol = new javax.swing.JLabel();
        btnAyuda = new javax.swing.JButton();
        scrollUsuariosBusqueda = new javax.swing.JScrollPane();
        tablaUsuarios = new javax.swing.JTable();
        panelCursos = new javax.swing.JPanel();
        manejoCursos = new javax.swing.JPanel();
        edicionCurso = new javax.swing.JLabel();
        btnBusquedaCurso = new javax.swing.JButton();
        btnEliminarCurso = new javax.swing.JButton();
        btnCancelarCurso = new javax.swing.JButton();
        imgCurso = new javax.swing.JLabel();
        btnAyudaCurso = new javax.swing.JButton();
        btnActualizarCurso = new javax.swing.JButton();
        btnAgregarCurso = new javax.swing.JButton();
        btnNuevoCurso = new javax.swing.JButton();
        campoCodigoCurso = new javax.swing.JTextField();
        astCurso = new javax.swing.JLabel();
        curso = new javax.swing.JLabel();
        astCodigoCurso = new javax.swing.JLabel();
        codigoCurso = new javax.swing.JLabel();
        campoCurso = new javax.swing.JTextField();
        estadoCurso = new javax.swing.JLabel();
        astEstadoCurso = new javax.swing.JLabel();
        estadoActivo = new javax.swing.JRadioButton();
        estadoDesactivo = new javax.swing.JRadioButton();
        scrollCursosBusqueda = new javax.swing.JScrollPane();
        tablaCursos = new javax.swing.JTable();
        panelMontos = new javax.swing.JPanel();
        scrollMontosBusqueda = new javax.swing.JScrollPane();
        tablaMontos = new javax.swing.JTable();
        jPanel1 = new javax.swing.JPanel();
        btnActualizarMonto = new javax.swing.JButton();
        campoActualizarMonto = new javax.swing.JTextField();
        btnAyudaMonto = new javax.swing.JButton();
        panelPromociones = new javax.swing.JPanel();
        scrollPromociones = new javax.swing.JScrollPane();
        tablaPromociones = new javax.swing.JTable();
        manejoPromociones = new javax.swing.JPanel();
        edicionPromocion = new javax.swing.JLabel();
        btnBusquedaPromocion = new javax.swing.JButton();
        btnEliminarPromocion = new javax.swing.JButton();
        btnCancelarPromocion = new javax.swing.JButton();
        btnAyudaPromocion = new javax.swing.JButton();
        btnActualizarPromocion = new javax.swing.JButton();
        btnAgregarPromocion = new javax.swing.JButton();
        btnNuevoPromocion = new javax.swing.JButton();
        campoCodigoPromocion = new javax.swing.JTextField();
        astPromocion = new javax.swing.JLabel();
        promocion = new javax.swing.JLabel();
        astCodigoPromocion = new javax.swing.JLabel();
        codigoPromocion = new javax.swing.JLabel();
        campoPromocion = new javax.swing.JTextField();
        estadoPromocion = new javax.swing.JLabel();
        astEstadoPromocion = new javax.swing.JLabel();
        estadoActivoPromocion = new javax.swing.JRadioButton();
        estadoDesactivoPromocion = new javax.swing.JRadioButton();
        imgPromocion = new javax.swing.JLabel();
        monto = new javax.swing.JLabel();
        astMontoPromocion = new javax.swing.JLabel();
        campoMontoPromocion = new javax.swing.JTextField();
        tipoMonto = new javax.swing.JLabel();
        astTipoMonto = new javax.swing.JLabel();
        checkTotal = new javax.swing.JRadioButton();
        checkDigitado = new javax.swing.JRadioButton();
        panelPromociones1 = new javax.swing.JPanel();
        manejoCursos2 = new javax.swing.JPanel();
        edicionPromocion1 = new javax.swing.JLabel();
        promocion1 = new javax.swing.JLabel();
        codigoPromocion1 = new javax.swing.JLabel();
        btnNuevoPromocion1 = new javax.swing.JButton();
        campoCodigoPromocion1 = new javax.swing.JTextField();
        campoPromocion1 = new javax.swing.JTextField();
        btnAgregarPromocion1 = new javax.swing.JButton();
        btnBusquedaPromocion1 = new javax.swing.JButton();
        btnEliminarPromocion1 = new javax.swing.JButton();
        btnCancelarPromocion1 = new javax.swing.JButton();
        imgPromocion1 = new javax.swing.JLabel();
        scrollPromocionesBusqueda1 = new javax.swing.JScrollPane();
        tablaPromociones1 = new javax.swing.JTable();
        panelPromocionEstudiantil1 = new javax.swing.JPanel();
        scrollPromocionEstudiantil1 = new javax.swing.JScrollPane();
        tablaPromocionEstudiantil1 = new javax.swing.JTable();
        btnAsignarPromocion1 = new javax.swing.JButton();
        btnDesasignarPromocion1 = new javax.swing.JButton();
        btnBusquedaPromocionEstudiantil1 = new javax.swing.JButton();
        campoBusquedaPromocionEstudiantil1 = new javax.swing.JTextField();
        inicioPromocion2 = new javax.swing.JLabel();
        inicioPromocion3 = new javax.swing.JLabel();
        btnCancelarPromocionEstudiantil1 = new javax.swing.JButton();
        fechaInicioPromocion1 = new com.michaelbaranov.microba.calendar.DatePicker();
        fechaExpiracionPromocion1 = new com.michaelbaranov.microba.calendar.DatePicker();
        scrollPromocionesEstBusqueda1 = new javax.swing.JScrollPane();
        tablaPromocionesEst1 = new javax.swing.JTable();
        panelModalidadPromociones1 = new javax.swing.JPanel();
        btnManejoPromociones1 = new javax.swing.JButton();
        btnPromocionEstudiantil1 = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        panelImagenEstudiante.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/BarraTituloFinal2.png"))); // NOI18N
        panelImagenEstudiante.setPreferredSize(new java.awt.Dimension(840, 60));

        version.setBackground(new java.awt.Color(255, 255, 255));
        version.setFont(new java.awt.Font("Arial", 1, 18)); // NOI18N
        version.setForeground(new java.awt.Color(255, 255, 255));
        version.setText("SMAMM 2.1");

        modulo.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
        modulo.setForeground(new java.awt.Color(255, 255, 255));
        modulo.setText("Módulo Administrador");

        perfil.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/SignedAs.png"))); // NOI18N

        usuario.setForeground(new java.awt.Color(255, 255, 255));
        usuario.setText("1235");

        registrado.setForeground(new java.awt.Color(255, 255, 255));
        registrado.setText("Registrado(a) como:");

        cerrarSesion.setForeground(new java.awt.Color(255, 255, 255));
        cerrarSesion.setText("Cerrar sesión");
        cerrarSesion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                cerrarSesionMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                cerrarSesionMouseExited(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                cerrarSesionMousePressed(evt);
            }
        });

        javax.swing.GroupLayout panelImagenEstudianteLayout = new javax.swing.GroupLayout(panelImagenEstudiante);
        panelImagenEstudiante.setLayout(panelImagenEstudianteLayout);
        panelImagenEstudianteLayout.setHorizontalGroup(
            panelImagenEstudianteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelImagenEstudianteLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(modulo, javax.swing.GroupLayout.PREFERRED_SIZE, 274, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(207, 207, 207)
                .addComponent(version)
                .addGap(158, 158, 158)
                .addComponent(perfil)
                .addGroup(panelImagenEstudianteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelImagenEstudianteLayout.createSequentialGroup()
                        .addGap(28, 28, 28)
                        .addComponent(registrado)
                        .addGap(26, 26, 26)
                        .addComponent(usuario, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelImagenEstudianteLayout.createSequentialGroup()
                        .addGap(101, 101, 101)
                        .addComponent(cerrarSesion)))
                .addGap(41, 41, 41))
        );
        panelImagenEstudianteLayout.setVerticalGroup(
            panelImagenEstudianteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelImagenEstudianteLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelImagenEstudianteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelImagenEstudianteLayout.createSequentialGroup()
                        .addGroup(panelImagenEstudianteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(registrado)
                            .addComponent(usuario, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(cerrarSesion)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(panelImagenEstudianteLayout.createSequentialGroup()
                        .addGroup(panelImagenEstudianteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(modulo)
                            .addGroup(panelImagenEstudianteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(version, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(perfil, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
        );

        panelImagenEstudiante2.setToolTipText("");
        panelImagenEstudiante2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/FondoBlanco.png"))); // NOI18N
        panelImagenEstudiante2.setPreferredSize(new java.awt.Dimension(840, 60));

        panelOpciones.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        panelOpciones.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                panelOpcionesStateChanged(evt);
            }
        });

        panelUsuarios.setBackground(new java.awt.Color(255, 255, 255));

        manejoUsuarios.setBackground(new java.awt.Color(255, 255, 255));
        manejoUsuarios.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true), "Manejo de usuarios", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18))); // NOI18N
        manejoUsuarios.setForeground(new java.awt.Color(204, 204, 204));

        id.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        id.setForeground(new java.awt.Color(102, 102, 102));
        id.setText("Usuario:");

        contrasena.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        contrasena.setForeground(new java.awt.Color(102, 102, 102));
        contrasena.setText("Contraseña:");

        roles.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        roles.setForeground(new java.awt.Color(102, 102, 102));
        roles.setText("Roles:");

        rolAdmin.setText("Administrador");
        rolAdmin.setEnabled(false);
        rolAdmin.setOpaque(false);
        rolAdmin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rolAdminActionPerformed(evt);
            }
        });

        rolEstandar.setText("Estandar");
        rolEstandar.setEnabled(false);
        rolEstandar.setOpaque(false);
        rolEstandar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rolEstandarActionPerformed(evt);
            }
        });

        imgUsuario.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/usuario.png"))); // NOI18N

        btnNuevo.setText("Nuevo");
        btnNuevo.setPreferredSize(new java.awt.Dimension(69, 23));
        btnNuevo.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnNuevoMouseClicked(evt);
            }
        });
        btnNuevo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNuevoActionPerformed(evt);
            }
        });

        btnEliminar.setText("Eliminar");
        btnEliminar.setEnabled(false);
        btnEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarActionPerformed(evt);
            }
        });

        btnBusqueda.setText("Búsqueda");
        btnBusqueda.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnBusquedaMouseClicked(evt);
            }
        });

        btnActualizar.setText("Actualizar");
        btnActualizar.setEnabled(false);
        btnActualizar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnActualizarMouseClicked(evt);
            }
        });

        btnCancelar.setText("Cancelar");
        btnCancelar.setEnabled(false);
        btnCancelar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnCancelarMouseClicked(evt);
            }
        });

        nuevaContrasena.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        nuevaContrasena.setForeground(new java.awt.Color(102, 102, 102));
        nuevaContrasena.setText("Confirmar contraseña:");
        nuevaContrasena.setPreferredSize(new java.awt.Dimension(149, 17));

        campoNuevaContrasena.setEnabled(false);
        campoNuevaContrasena.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                campoNuevaContrasenaKeyTyped(evt);
            }
        });

        campoContrasena.setEnabled(false);
        campoContrasena.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                campoContrasenaKeyTyped(evt);
            }
        });

        btnAgregar.setText("Agregar");
        btnAgregar.setEnabled(false);
        btnAgregar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnAgregarMouseClicked(evt);
            }
        });

        edicion.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        edicion.setForeground(new java.awt.Color(102, 102, 102));
        edicion.setText("Edición: esperando...");

        campoId.setEnabled(false);
        campoId.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoIdKeyReleased(evt);
            }
        });

        astUsuario.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astUsuario.setToolTipText("Espacio requerido");

        astContrasena.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astContrasena.setToolTipText("Espacio requerido");

        astNuevaContrasena.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astNuevaContrasena.setToolTipText("Espacio requerido");

        astRol.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astRol.setToolTipText("Espacio requerido");

        btnAyuda.setFont(new java.awt.Font("Calibri", 0, 16)); // NOI18N
        btnAyuda.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/ayuda.png"))); // NOI18N
        btnAyuda.setText("Ayuda");
        btnAyuda.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnAyudaMouseClicked(evt);
            }
        });

        javax.swing.GroupLayout manejoUsuariosLayout = new javax.swing.GroupLayout(manejoUsuarios);
        manejoUsuarios.setLayout(manejoUsuariosLayout);
        manejoUsuariosLayout.setHorizontalGroup(
            manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, manejoUsuariosLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(btnAyuda)
                .addGap(43, 43, 43)
                .addComponent(imgUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(54, 54, 54))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, manejoUsuariosLayout.createSequentialGroup()
                .addGap(26, 26, 26)
                .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(manejoUsuariosLayout.createSequentialGroup()
                        .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(manejoUsuariosLayout.createSequentialGroup()
                                .addComponent(rolAdmin)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 96, Short.MAX_VALUE)
                                .addComponent(rolEstandar, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(manejoUsuariosLayout.createSequentialGroup()
                                .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(manejoUsuariosLayout.createSequentialGroup()
                                        .addComponent(nuevaContrasena, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(astNuevaContrasena))
                                    .addGroup(manejoUsuariosLayout.createSequentialGroup()
                                        .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, manejoUsuariosLayout.createSequentialGroup()
                                                .addComponent(id)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(astUsuario))
                                            .addComponent(contrasena))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(astContrasena)))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(campoContrasena, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 98, Short.MAX_VALUE)
                                    .addComponent(campoId, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(campoNuevaContrasena, javax.swing.GroupLayout.Alignment.TRAILING))))
                        .addGap(34, 34, 34))
                    .addGroup(manejoUsuariosLayout.createSequentialGroup()
                        .addComponent(roles)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(astRol)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(btnAgregar, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnNuevo, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnActualizar)
                    .addComponent(btnBusqueda)
                    .addComponent(btnEliminar, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(36, 36, 36))
            .addGroup(manejoUsuariosLayout.createSequentialGroup()
                .addGap(158, 158, 158)
                .addComponent(edicion, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        manejoUsuariosLayout.setVerticalGroup(
            manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(manejoUsuariosLayout.createSequentialGroup()
                .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(manejoUsuariosLayout.createSequentialGroup()
                        .addGap(43, 43, 43)
                        .addComponent(btnNuevo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(11, 11, 11)
                        .addComponent(btnAgregar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnActualizar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
                        .addComponent(btnBusqueda)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnEliminar)
                        .addGap(11, 11, 11)
                        .addComponent(btnCancelar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE))
                    .addGroup(manejoUsuariosLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(edicion, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(campoId, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(id)
                            .addComponent(astUsuario))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(campoContrasena, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(contrasena)
                            .addComponent(astContrasena))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(astNuevaContrasena)
                            .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(nuevaContrasena, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(campoNuevaContrasena, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(roles)
                            .addComponent(astRol))
                        .addGap(18, 18, 18)
                        .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(rolEstandar)
                            .addComponent(rolAdmin))
                        .addGap(26, 26, 26)))
                .addGroup(manejoUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(imgUsuario)
                    .addGroup(manejoUsuariosLayout.createSequentialGroup()
                        .addGap(34, 34, 34)
                        .addComponent(btnAyuda)))
                .addGap(22, 22, 22))
        );

        scrollUsuariosBusqueda.setBackground(new java.awt.Color(255, 204, 51));
        scrollUsuariosBusqueda.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Usuarios del Sistema", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18))); // NOI18N

        tablaUsuarios.setAutoCreateRowSorter(true);
        tablaUsuarios.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaUsuarios.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Usuario", "Rol", "Último Acceso"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaUsuarios.setGridColor(new java.awt.Color(0, 153, 255));
        tablaUsuarios.getTableHeader().setResizingAllowed(false);
        tablaUsuarios.getTableHeader().setReorderingAllowed(false);
        scrollUsuariosBusqueda.setViewportView(tablaUsuarios);

        javax.swing.GroupLayout panelUsuariosLayout = new javax.swing.GroupLayout(panelUsuarios);
        panelUsuarios.setLayout(panelUsuariosLayout);
        panelUsuariosLayout.setHorizontalGroup(
            panelUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelUsuariosLayout.createSequentialGroup()
                .addGap(103, 103, 103)
                .addComponent(manejoUsuarios, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 136, Short.MAX_VALUE)
                .addComponent(scrollUsuariosBusqueda, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(103, 103, 103))
        );
        panelUsuariosLayout.setVerticalGroup(
            panelUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelUsuariosLayout.createSequentialGroup()
                .addGap(28, 28, 28)
                .addGroup(panelUsuariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(manejoUsuarios, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(scrollUsuariosBusqueda, javax.swing.GroupLayout.DEFAULT_SIZE, 468, Short.MAX_VALUE))
                .addContainerGap(13, Short.MAX_VALUE))
        );

        panelOpciones.addTab("Sección de Usuarios", panelUsuarios);

        panelCursos.setBackground(new java.awt.Color(255, 255, 255));

        manejoCursos.setBackground(new java.awt.Color(255, 255, 255));
        manejoCursos.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true), "Manejo de Cursos", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18))); // NOI18N
        manejoCursos.setForeground(new java.awt.Color(204, 204, 204));
        manejoCursos.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        edicionCurso.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        edicionCurso.setForeground(new java.awt.Color(102, 102, 102));
        edicionCurso.setText("Edición: esperando...");
        manejoCursos.add(edicionCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 50, 141, 18));

        btnBusquedaCurso.setText("Búsqueda");
        btnBusquedaCurso.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnBusquedaCursoMousePressed(evt);
            }
        });
        manejoCursos.add(btnBusquedaCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 200, 90, 23));

        btnEliminarCurso.setText("Eliminar");
        btnEliminarCurso.setEnabled(false);
        btnEliminarCurso.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnEliminarCursoMousePressed(evt);
            }
        });
        btnEliminarCurso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarCursoActionPerformed(evt);
            }
        });
        manejoCursos.add(btnEliminarCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 230, 90, 23));

        btnCancelarCurso.setText("Cancelar");
        btnCancelarCurso.setEnabled(false);
        btnCancelarCurso.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnCancelarCursoMousePressed(evt);
            }
        });
        manejoCursos.add(btnCancelarCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 260, 90, 23));

        imgCurso.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/imgClase.jpg"))); // NOI18N
        imgCurso.setText("jLabel1");
        manejoCursos.add(imgCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 250, 129, 118));

        btnAyudaCurso.setFont(new java.awt.Font("Calibri", 0, 16)); // NOI18N
        btnAyudaCurso.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/ayuda.png"))); // NOI18N
        btnAyudaCurso.setText("Ayuda");
        btnAyudaCurso.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnAyudaCursoMouseClicked(evt);
            }
        });
        btnAyudaCurso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAyudaCursoActionPerformed(evt);
            }
        });
        manejoCursos.add(btnAyudaCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(340, 30, -1, -1));

        btnActualizarCurso.setText("Actualizar");
        btnActualizarCurso.setEnabled(false);
        btnActualizarCurso.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnActualizarCursoMouseClicked(evt);
            }
        });
        btnActualizarCurso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnActualizarCursoActionPerformed(evt);
            }
        });
        manejoCursos.add(btnActualizarCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 170, 90, 23));

        btnAgregarCurso.setText("Agregar");
        btnAgregarCurso.setEnabled(false);
        btnAgregarCurso.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnAgregarCursoMouseClicked(evt);
            }
        });
        manejoCursos.add(btnAgregarCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 140, 90, 23));

        btnNuevoCurso.setText("Nuevo");
        btnNuevoCurso.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnNuevoCursoMouseClicked(evt);
            }
        });
        btnNuevoCurso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNuevoCursoActionPerformed(evt);
            }
        });
        manejoCursos.add(btnNuevoCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 107, 90, 23));

        campoCodigoCurso.setEnabled(false);
        campoCodigoCurso.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoCodigoCursoKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                campoCodigoCursoKeyTyped(evt);
            }
        });
        manejoCursos.add(campoCodigoCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(150, 110, 170, -1));

        astCurso.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astCurso.setToolTipText("Espacio requerido");
        manejoCursos.add(astCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 140, -1, -1));

        curso.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        curso.setForeground(new java.awt.Color(102, 102, 102));
        curso.setText("Curso:");
        manejoCursos.add(curso, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 140, 45, 20));

        astCodigoCurso.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astCodigoCurso.setToolTipText("Espacio requerido");
        manejoCursos.add(astCodigoCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 110, -1, -1));

        codigoCurso.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        codigoCurso.setForeground(new java.awt.Color(102, 102, 102));
        codigoCurso.setText("Código:");
        manejoCursos.add(codigoCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 110, -1, -1));

        campoCurso.setBackground(new java.awt.Color(240, 240, 240));
        campoCurso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoCursoActionPerformed(evt);
            }
        });
        campoCurso.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoCursoKeyReleased(evt);
            }
        });
        manejoCursos.add(campoCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(150, 140, 170, -1));

        estadoCurso.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        estadoCurso.setForeground(new java.awt.Color(102, 102, 102));
        estadoCurso.setText("Estado del curso:");
        manejoCursos.add(estadoCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 180, 110, 20));

        astEstadoCurso.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astEstadoCurso.setToolTipText("Espacio requerido");
        manejoCursos.add(astEstadoCurso, new org.netbeans.lib.awtextra.AbsoluteConstraints(180, 180, -1, -1));

        estadoActivo.setText("Activo");
        estadoActivo.setOpaque(false);
        estadoActivo.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                estadoActivoMouseClicked(evt);
            }
        });
        manejoCursos.add(estadoActivo, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 220, -1, -1));

        estadoDesactivo.setText("Desactivo");
        estadoDesactivo.setOpaque(false);
        estadoDesactivo.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                estadoDesactivoMouseClicked(evt);
            }
        });
        manejoCursos.add(estadoDesactivo, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 220, -1, -1));

        scrollCursosBusqueda.setBackground(new java.awt.Color(0, 153, 204));
        scrollCursosBusqueda.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Cursos registrados", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18), java.awt.Color.white)); // NOI18N

        tablaCursos.setAutoCreateRowSorter(true);
        tablaCursos.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaCursos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Código", "Curso", "Estado"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaCursos.setGridColor(new java.awt.Color(0, 204, 204));
        tablaCursos.getTableHeader().setResizingAllowed(false);
        tablaCursos.getTableHeader().setReorderingAllowed(false);
        scrollCursosBusqueda.setViewportView(tablaCursos);

        javax.swing.GroupLayout panelCursosLayout = new javax.swing.GroupLayout(panelCursos);
        panelCursos.setLayout(panelCursosLayout);
        panelCursosLayout.setHorizontalGroup(
            panelCursosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCursosLayout.createSequentialGroup()
                .addGap(120, 120, 120)
                .addComponent(manejoCursos, javax.swing.GroupLayout.PREFERRED_SIZE, 522, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(103, 103, 103)
                .addComponent(scrollCursosBusqueda, javax.swing.GroupLayout.PREFERRED_SIZE, 393, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(120, Short.MAX_VALUE))
        );
        panelCursosLayout.setVerticalGroup(
            panelCursosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCursosLayout.createSequentialGroup()
                .addGap(62, 62, 62)
                .addGroup(panelCursosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(manejoCursos, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .addComponent(scrollCursosBusqueda, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
                .addContainerGap(67, Short.MAX_VALUE))
        );

        panelOpciones.addTab("Sección de Cursos", panelCursos);

        panelMontos.setBackground(new java.awt.Color(255, 255, 255));

        scrollMontosBusqueda.setBackground(new java.awt.Color(0, 153, 204));
        scrollMontosBusqueda.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Montos autorizados", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18), java.awt.Color.white)); // NOI18N
        scrollMontosBusqueda.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N

        tablaMontos.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaMontos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Código", "Concepto", "Monto"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, true
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaMontos.setGridColor(new java.awt.Color(0, 204, 204));
        tablaMontos.getTableHeader().setResizingAllowed(false);
        tablaMontos.getTableHeader().setReorderingAllowed(false);
        scrollMontosBusqueda.setViewportView(tablaMontos);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 153, 204)), "Nuevo monto", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 14), java.awt.Color.gray)); // NOI18N

        btnActualizarMonto.setText("Actualizar monto");
        btnActualizarMonto.setEnabled(false);
        btnActualizarMonto.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnActualizarMontoMousePressed(evt);
            }
        });

        campoActualizarMonto.setEnabled(false);
        campoActualizarMonto.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                campoActualizarMontoKeyTyped(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap(53, Short.MAX_VALUE)
                .addComponent(btnActualizarMonto, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(40, 40, 40)
                .addComponent(campoActualizarMonto, javax.swing.GroupLayout.PREFERRED_SIZE, 173, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(35, 35, 35))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(29, 29, 29)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnActualizarMonto)
                    .addComponent(campoActualizarMonto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(48, Short.MAX_VALUE))
        );

        btnAyudaMonto.setFont(new java.awt.Font("Calibri", 0, 16)); // NOI18N
        btnAyudaMonto.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/ayuda.png"))); // NOI18N
        btnAyudaMonto.setText("Ayuda");
        btnAyudaMonto.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnAyudaMontoMouseClicked(evt);
            }
        });
        btnAyudaMonto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAyudaMontoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelMontosLayout = new javax.swing.GroupLayout(panelMontos);
        panelMontos.setLayout(panelMontosLayout);
        panelMontosLayout.setHorizontalGroup(
            panelMontosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelMontosLayout.createSequentialGroup()
                .addContainerGap(294, Short.MAX_VALUE)
                .addComponent(scrollMontosBusqueda, javax.swing.GroupLayout.PREFERRED_SIZE, 671, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(293, 293, 293))
            .addGroup(panelMontosLayout.createSequentialGroup()
                .addGap(335, 335, 335)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(34, 34, 34)
                .addComponent(btnAyudaMonto)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        panelMontosLayout.setVerticalGroup(
            panelMontosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelMontosLayout.createSequentialGroup()
                .addGap(81, 81, 81)
                .addComponent(scrollMontosBusqueda, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(panelMontosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelMontosLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelMontosLayout.createSequentialGroup()
                        .addGap(53, 53, 53)
                        .addComponent(btnAyudaMonto)))
                .addContainerGap(115, Short.MAX_VALUE))
        );

        panelOpciones.addTab("Sección de Montos", panelMontos);

        panelPromociones.setBackground(new java.awt.Color(255, 255, 255));

        scrollPromociones.setBackground(new java.awt.Color(0, 153, 204));
        scrollPromociones.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Promociones autorizadas", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18), java.awt.Color.white)); // NOI18N
        scrollPromociones.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N

        tablaPromociones.setAutoCreateRowSorter(true);
        tablaPromociones.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaPromociones.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Código", "Promoción", "Monto", "Estado"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaPromociones.setGridColor(new java.awt.Color(0, 204, 204));
        tablaPromociones.getTableHeader().setResizingAllowed(false);
        tablaPromociones.getTableHeader().setReorderingAllowed(false);
        scrollPromociones.setViewportView(tablaPromociones);

        manejoPromociones.setBackground(new java.awt.Color(255, 255, 255));
        manejoPromociones.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true), "Manejo de Promociones", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18))); // NOI18N
        manejoPromociones.setForeground(new java.awt.Color(204, 204, 204));
        manejoPromociones.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        edicionPromocion.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        edicionPromocion.setForeground(new java.awt.Color(102, 102, 102));
        edicionPromocion.setText("Edición: esperando...");
        manejoPromociones.add(edicionPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 50, 141, 18));

        btnBusquedaPromocion.setText("Búsqueda");
        btnBusquedaPromocion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnBusquedaPromocionMouseClicked(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnBusquedaPromocionMousePressed(evt);
            }
        });
        manejoPromociones.add(btnBusquedaPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 200, 90, 23));

        btnEliminarPromocion.setText("Eliminar");
        btnEliminarPromocion.setEnabled(false);
        btnEliminarPromocion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnEliminarPromocionMouseClicked(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnEliminarPromocionMousePressed(evt);
            }
        });
        btnEliminarPromocion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarPromocionActionPerformed(evt);
            }
        });
        manejoPromociones.add(btnEliminarPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 230, 90, 23));

        btnCancelarPromocion.setText("Cancelar");
        btnCancelarPromocion.setEnabled(false);
        btnCancelarPromocion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnCancelarPromocionMouseClicked(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnCancelarPromocionMousePressed(evt);
            }
        });
        manejoPromociones.add(btnCancelarPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 260, 90, 23));

        btnAyudaPromocion.setFont(new java.awt.Font("Calibri", 0, 16)); // NOI18N
        btnAyudaPromocion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/ayuda.png"))); // NOI18N
        btnAyudaPromocion.setText("Ayuda");
        btnAyudaPromocion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnAyudaPromocionMouseClicked(evt);
            }
        });
        btnAyudaPromocion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAyudaPromocionActionPerformed(evt);
            }
        });
        manejoPromociones.add(btnAyudaPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(340, 30, -1, -1));

        btnActualizarPromocion.setText("Actualizar");
        btnActualizarPromocion.setEnabled(false);
        btnActualizarPromocion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnActualizarPromocionMouseClicked(evt);
            }
        });
        btnActualizarPromocion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnActualizarPromocionActionPerformed(evt);
            }
        });
        manejoPromociones.add(btnActualizarPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 170, 90, 23));

        btnAgregarPromocion.setText("Agregar");
        btnAgregarPromocion.setEnabled(false);
        btnAgregarPromocion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnAgregarPromocionMouseClicked(evt);
            }
        });
        btnAgregarPromocion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAgregarPromocionActionPerformed(evt);
            }
        });
        manejoPromociones.add(btnAgregarPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 140, 90, 23));

        btnNuevoPromocion.setText("Nuevo");
        btnNuevoPromocion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnNuevoPromocionMouseClicked(evt);
            }
        });
        btnNuevoPromocion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNuevoPromocionActionPerformed(evt);
            }
        });
        manejoPromociones.add(btnNuevoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(370, 107, 90, 23));

        campoCodigoPromocion.setEnabled(false);
        campoCodigoPromocion.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoCodigoPromocionKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                campoCodigoPromocionKeyTyped(evt);
            }
        });
        manejoPromociones.add(campoCodigoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 110, 170, -1));

        astPromocion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astPromocion.setToolTipText("Espacio requerido");
        manejoPromociones.add(astPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 140, -1, -1));

        promocion.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        promocion.setForeground(new java.awt.Color(102, 102, 102));
        promocion.setText("Promoción:");
        manejoPromociones.add(promocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 140, 70, 20));

        astCodigoPromocion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astCodigoPromocion.setToolTipText("Espacio requerido");
        manejoPromociones.add(astCodigoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 110, -1, -1));

        codigoPromocion.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        codigoPromocion.setForeground(new java.awt.Color(102, 102, 102));
        codigoPromocion.setText("Código:");
        manejoPromociones.add(codigoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 110, -1, -1));

        campoPromocion.setBackground(new java.awt.Color(240, 240, 240));
        campoPromocion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoPromocionActionPerformed(evt);
            }
        });
        campoPromocion.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoPromocionKeyReleased(evt);
            }
        });
        manejoPromociones.add(campoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 140, 170, -1));

        estadoPromocion.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        estadoPromocion.setForeground(new java.awt.Color(102, 102, 102));
        estadoPromocion.setText("Estado de la promoción:");
        manejoPromociones.add(estadoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 230, 150, 20));

        astEstadoPromocion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astEstadoPromocion.setToolTipText("Espacio requerido");
        manejoPromociones.add(astEstadoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(220, 230, -1, -1));

        estadoActivoPromocion.setText("Activa");
        estadoActivoPromocion.setEnabled(false);
        estadoActivoPromocion.setOpaque(false);
        estadoActivoPromocion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                estadoActivoPromocionMouseClicked(evt);
            }
        });
        manejoPromociones.add(estadoActivoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 270, -1, -1));

        estadoDesactivoPromocion.setText("Desactiva");
        estadoDesactivoPromocion.setEnabled(false);
        estadoDesactivoPromocion.setOpaque(false);
        estadoDesactivoPromocion.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                estadoDesactivoPromocionMouseClicked(evt);
            }
        });
        manejoPromociones.add(estadoDesactivoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 270, -1, -1));

        imgPromocion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/promocion.png"))); // NOI18N
        imgPromocion.setText("jLabel1");
        manejoPromociones.add(imgPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 310, 174, 118));

        monto.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        monto.setForeground(new java.awt.Color(102, 102, 102));
        monto.setText("Monto:");
        manejoPromociones.add(monto, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 200, -1, 20));

        astMontoPromocion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astMontoPromocion.setToolTipText("Espacio requerido");
        manejoPromociones.add(astMontoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 200, -1, -1));

        campoMontoPromocion.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoMontoPromocionKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                campoMontoPromocionKeyTyped(evt);
            }
        });
        manejoPromociones.add(campoMontoPromocion, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 200, 170, -1));

        tipoMonto.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        tipoMonto.setForeground(new java.awt.Color(102, 102, 102));
        tipoMonto.setText("Tipo monto:");
        manejoPromociones.add(tipoMonto, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 170, -1, 20));

        astTipoMonto.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asterisco.png"))); // NOI18N
        astTipoMonto.setToolTipText("Espacio requerido");
        manejoPromociones.add(astTipoMonto, new org.netbeans.lib.awtextra.AbsoluteConstraints(150, 170, -1, -1));

        grupoTipoMonto.add(checkTotal);
        checkTotal.setText("Total");
        checkTotal.setEnabled(false);
        checkTotal.setOpaque(false);
        checkTotal.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                checkTotalMouseClicked(evt);
            }
        });
        manejoPromociones.add(checkTotal, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 170, -1, -1));

        grupoTipoMonto.add(checkDigitado);
        checkDigitado.setText("Digitado");
        checkDigitado.setEnabled(false);
        checkDigitado.setOpaque(false);
        checkDigitado.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                checkDigitadoMouseClicked(evt);
            }
        });
        manejoPromociones.add(checkDigitado, new org.netbeans.lib.awtextra.AbsoluteConstraints(240, 170, -1, -1));

        javax.swing.GroupLayout panelPromocionesLayout = new javax.swing.GroupLayout(panelPromociones);
        panelPromociones.setLayout(panelPromocionesLayout);
        panelPromocionesLayout.setHorizontalGroup(
            panelPromocionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPromocionesLayout.createSequentialGroup()
                .addContainerGap(45, Short.MAX_VALUE)
                .addComponent(manejoPromociones, javax.swing.GroupLayout.PREFERRED_SIZE, 556, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(70, 70, 70)
                .addComponent(scrollPromociones, javax.swing.GroupLayout.PREFERRED_SIZE, 542, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(45, 45, 45))
        );
        panelPromocionesLayout.setVerticalGroup(
            panelPromocionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPromocionesLayout.createSequentialGroup()
                .addGap(34, 34, 34)
                .addGroup(panelPromocionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(scrollPromociones, javax.swing.GroupLayout.PREFERRED_SIZE, 438, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(manejoPromociones, javax.swing.GroupLayout.PREFERRED_SIZE, 438, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(37, Short.MAX_VALUE))
        );

        panelOpciones.addTab("Sección de Promociones", panelPromociones);

        panelPromociones1.setBackground(new java.awt.Color(255, 255, 255));

        manejoCursos2.setBackground(new java.awt.Color(255, 255, 255));
        manejoCursos2.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true), "Manejo de Promociones", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18))); // NOI18N
        manejoCursos2.setForeground(new java.awt.Color(204, 204, 204));

        edicionPromocion1.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        edicionPromocion1.setForeground(new java.awt.Color(102, 102, 102));
        edicionPromocion1.setText("Edición: esperando...");

        promocion1.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        promocion1.setForeground(new java.awt.Color(102, 102, 102));
        promocion1.setText("Promoción:");

        codigoPromocion1.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        codigoPromocion1.setForeground(new java.awt.Color(102, 102, 102));
        codigoPromocion1.setText("Cógido:");

        btnNuevoPromocion1.setText("Nuevo");
        btnNuevoPromocion1.setEnabled(false);
        btnNuevoPromocion1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnNuevoPromocion1MousePressed(evt);
            }
        });

        campoCodigoPromocion1.setEnabled(false);
        campoCodigoPromocion1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoCodigoPromocion1KeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                campoCodigoPromocion1KeyTyped(evt);
            }
        });

        campoPromocion1.setEnabled(false);
        campoPromocion1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoPromocion1ActionPerformed(evt);
            }
        });

        btnAgregarPromocion1.setText("Agregar");
        btnAgregarPromocion1.setEnabled(false);
        btnAgregarPromocion1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnAgregarPromocion1MousePressed(evt);
            }
        });

        btnBusquedaPromocion1.setText("Búsqueda");
        btnBusquedaPromocion1.setEnabled(false);
        btnBusquedaPromocion1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnBusquedaPromocion1MousePressed(evt);
            }
        });

        btnEliminarPromocion1.setText("Eliminar");
        btnEliminarPromocion1.setEnabled(false);
        btnEliminarPromocion1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnEliminarPromocion1MousePressed(evt);
            }
        });
        btnEliminarPromocion1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarPromocion1ActionPerformed(evt);
            }
        });

        btnCancelarPromocion1.setText("Cancelar");
        btnCancelarPromocion1.setEnabled(false);
        btnCancelarPromocion1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnCancelarPromocion1MousePressed(evt);
            }
        });

        imgPromocion1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/promocion.png"))); // NOI18N
        imgPromocion1.setText("jLabel1");

        javax.swing.GroupLayout manejoCursos2Layout = new javax.swing.GroupLayout(manejoCursos2);
        manejoCursos2.setLayout(manejoCursos2Layout);
        manejoCursos2Layout.setHorizontalGroup(
            manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(manejoCursos2Layout.createSequentialGroup()
                .addGap(35, 35, 35)
                .addGroup(manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(btnBusquedaPromocion1)
                    .addGroup(manejoCursos2Layout.createSequentialGroup()
                        .addGroup(manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(manejoCursos2Layout.createSequentialGroup()
                                .addGroup(manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(promocion1)
                                    .addComponent(codigoPromocion1))
                                .addGap(29, 29, 29)
                                .addGroup(manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(campoCodigoPromocion1)
                                    .addComponent(campoPromocion1, javax.swing.GroupLayout.DEFAULT_SIZE, 137, Short.MAX_VALUE)))
                            .addGroup(manejoCursos2Layout.createSequentialGroup()
                                .addComponent(imgPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, 174, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(29, 29, 29)))
                        .addGroup(manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, manejoCursos2Layout.createSequentialGroup()
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(btnCancelarPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(manejoCursos2Layout.createSequentialGroup()
                                .addGap(28, 28, 28)
                                .addGroup(manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(btnAgregarPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(btnNuevoPromocion1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(btnEliminarPromocion1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE))))))
                .addContainerGap(27, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, manejoCursos2Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(edicionPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(120, 120, 120))
        );
        manejoCursos2Layout.setVerticalGroup(
            manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(manejoCursos2Layout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addComponent(edicionPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnNuevoPromocion1)
                    .addComponent(campoCodigoPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(codigoPromocion1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(promocion1)
                    .addComponent(btnAgregarPromocion1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnBusquedaPromocion1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(manejoCursos2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(manejoCursos2Layout.createSequentialGroup()
                        .addComponent(btnEliminarPromocion1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCancelarPromocion1))
                    .addComponent(imgPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, 118, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(41, Short.MAX_VALUE))
        );

        scrollPromocionesBusqueda1.setBackground(new java.awt.Color(0, 153, 204));
        scrollPromocionesBusqueda1.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Promociones autorizadas", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18), java.awt.Color.white)); // NOI18N
        scrollPromocionesBusqueda1.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N

        tablaPromociones1.setAutoCreateRowSorter(true);
        tablaPromociones1.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaPromociones1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Código", "Promoción"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaPromociones1.setGridColor(new java.awt.Color(0, 204, 204));
        scrollPromocionesBusqueda1.setViewportView(tablaPromociones1);

        panelPromocionEstudiantil1.setBackground(new java.awt.Color(255, 255, 255));
        panelPromocionEstudiantil1.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true), "Promoción estudiantil", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18))); // NOI18N

        scrollPromocionEstudiantil1.setBackground(new java.awt.Color(0, 153, 204));
        scrollPromocionEstudiantil1.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Promociones de Estudiantes Registradas", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18), java.awt.Color.white)); // NOI18N
        scrollPromocionEstudiantil1.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N

        tablaPromocionEstudiantil1.setAutoCreateRowSorter(true);
        tablaPromocionEstudiantil1.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaPromocionEstudiantil1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Cédula estudiante", "Nombre estudiante", "Promoción", "Desde", "Hasta"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaPromocionEstudiantil1.setGridColor(new java.awt.Color(0, 204, 204));
        scrollPromocionEstudiantil1.setViewportView(tablaPromocionEstudiantil1);

        btnAsignarPromocion1.setText("Asignar promoción");
        btnAsignarPromocion1.setEnabled(false);
        btnAsignarPromocion1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnAsignarPromocion1MousePressed(evt);
            }
        });
        btnAsignarPromocion1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAsignarPromocion1ActionPerformed(evt);
            }
        });

        btnDesasignarPromocion1.setText("Desasignar promoción");
        btnDesasignarPromocion1.setEnabled(false);
        btnDesasignarPromocion1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnDesasignarPromocion1MousePressed(evt);
            }
        });
        btnDesasignarPromocion1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDesasignarPromocion1ActionPerformed(evt);
            }
        });

        btnBusquedaPromocionEstudiantil1.setText("Búsqueda:");
        btnBusquedaPromocionEstudiantil1.setEnabled(false);
        btnBusquedaPromocionEstudiantil1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnBusquedaPromocionEstudiantil1MousePressed(evt);
            }
        });
        btnBusquedaPromocionEstudiantil1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBusquedaPromocionEstudiantil1ActionPerformed(evt);
            }
        });

        campoBusquedaPromocionEstudiantil1.setEnabled(false);
        campoBusquedaPromocionEstudiantil1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoBusquedaPromocionEstudiantil1KeyReleased(evt);
            }
        });

        inicioPromocion2.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        inicioPromocion2.setForeground(new java.awt.Color(102, 102, 102));
        inicioPromocion2.setText("Inicio de la promoción:");

        inicioPromocion3.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        inicioPromocion3.setForeground(new java.awt.Color(102, 102, 102));
        inicioPromocion3.setText("Expiración de la promoción:");

        btnCancelarPromocionEstudiantil1.setText("Cancelar");
        btnCancelarPromocionEstudiantil1.setEnabled(false);
        btnCancelarPromocionEstudiantil1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnCancelarPromocionEstudiantil1MousePressed(evt);
            }
        });

        try {
            fechaInicioPromocion1.setDate(null);
        } catch (java.beans.PropertyVetoException e1) {
            e1.printStackTrace();
        }
        fechaInicioPromocion1.setEnabled(false);
        fechaInicioPromocion1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fechaInicioPromocion1ActionPerformed(evt);
            }
        });
        fechaInicioPromocion1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fechaInicioPromocion1KeyTyped(evt);
            }
        });

        try {
            fechaExpiracionPromocion1.setDate(null);
        } catch (java.beans.PropertyVetoException e1) {
            e1.printStackTrace();
        }
        fechaExpiracionPromocion1.setEnabled(false);
        fechaExpiracionPromocion1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fechaExpiracionPromocion1ActionPerformed(evt);
            }
        });
        fechaExpiracionPromocion1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                fechaExpiracionPromocion1KeyTyped(evt);
            }
        });

        javax.swing.GroupLayout panelPromocionEstudiantil1Layout = new javax.swing.GroupLayout(panelPromocionEstudiantil1);
        panelPromocionEstudiantil1.setLayout(panelPromocionEstudiantil1Layout);
        panelPromocionEstudiantil1Layout.setHorizontalGroup(
            panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPromocionEstudiantil1Layout.createSequentialGroup()
                .addGroup(panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelPromocionEstudiantil1Layout.createSequentialGroup()
                        .addGroup(panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelPromocionEstudiantil1Layout.createSequentialGroup()
                                .addGap(24, 24, 24)
                                .addComponent(inicioPromocion3))
                            .addGroup(panelPromocionEstudiantil1Layout.createSequentialGroup()
                                .addGap(39, 39, 39)
                                .addGroup(panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(btnCancelarPromocionEstudiantil1, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(btnAsignarPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE)))
                            .addGroup(panelPromocionEstudiantil1Layout.createSequentialGroup()
                                .addGap(35, 35, 35)
                                .addComponent(inicioPromocion2)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 14, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPromocionEstudiantil1Layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addGroup(panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPromocionEstudiantil1Layout.createSequentialGroup()
                                .addComponent(fechaInicioPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(43, 43, 43))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPromocionEstudiantil1Layout.createSequentialGroup()
                                .addComponent(fechaExpiracionPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(44, 44, 44)))))
                .addGroup(panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPromocionEstudiantil1Layout.createSequentialGroup()
                        .addComponent(btnBusquedaPromocionEstudiantil1)
                        .addGap(18, 18, 18)
                        .addComponent(campoBusquedaPromocionEstudiantil1, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(34, 34, 34)
                        .addComponent(btnDesasignarPromocion1)
                        .addGap(39, 39, 39))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPromocionEstudiantil1Layout.createSequentialGroup()
                        .addComponent(scrollPromocionEstudiantil1, javax.swing.GroupLayout.PREFERRED_SIZE, 537, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(19, 19, 19))))
        );
        panelPromocionEstudiantil1Layout.setVerticalGroup(
            panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPromocionEstudiantil1Layout.createSequentialGroup()
                .addGroup(panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(panelPromocionEstudiantil1Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(scrollPromocionEstudiantil1, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelPromocionEstudiantil1Layout.createSequentialGroup()
                        .addGap(34, 34, 34)
                        .addComponent(inicioPromocion2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(fechaInicioPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(inicioPromocion3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(fechaExpiracionPromocion1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(23, 23, 23)
                        .addComponent(btnAsignarPromocion1)))
                .addGroup(panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelPromocionEstudiantil1Layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCancelarPromocionEstudiantil1)
                        .addContainerGap(23, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPromocionEstudiantil1Layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(panelPromocionEstudiantil1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnDesasignarPromocion1)
                            .addComponent(campoBusquedaPromocionEstudiantil1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(btnBusquedaPromocionEstudiantil1))
                        .addContainerGap())))
        );

        scrollPromocionesEstBusqueda1.setBackground(new java.awt.Color(0, 153, 204));
        scrollPromocionesEstBusqueda1.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Estudiantes registrados", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18), java.awt.Color.white)); // NOI18N
        scrollPromocionesEstBusqueda1.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N

        tablaPromocionesEst1.setAutoCreateRowSorter(true);
        tablaPromocionesEst1.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaPromocionesEst1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Cédula", "Nombre completo"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaPromocionesEst1.setGridColor(new java.awt.Color(0, 204, 204));
        scrollPromocionesEstBusqueda1.setViewportView(tablaPromocionesEst1);

        panelModalidadPromociones1.setBackground(new java.awt.Color(255, 255, 255));
        panelModalidadPromociones1.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true), "Seleccionar Modalidad: ", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18))); // NOI18N

        btnManejoPromociones1.setText("Manejo de Promociones");
        btnManejoPromociones1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnManejoPromociones1MousePressed(evt);
            }
        });

        btnPromocionEstudiantil1.setText("Promoción Estudiantil");
        btnPromocionEstudiantil1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnPromocionEstudiantil1MousePressed(evt);
            }
        });

        javax.swing.GroupLayout panelModalidadPromociones1Layout = new javax.swing.GroupLayout(panelModalidadPromociones1);
        panelModalidadPromociones1.setLayout(panelModalidadPromociones1Layout);
        panelModalidadPromociones1Layout.setHorizontalGroup(
            panelModalidadPromociones1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelModalidadPromociones1Layout.createSequentialGroup()
                .addGap(36, 36, 36)
                .addComponent(btnManejoPromociones1)
                .addGap(27, 27, 27)
                .addComponent(btnPromocionEstudiantil1)
                .addContainerGap(44, Short.MAX_VALUE))
        );
        panelModalidadPromociones1Layout.setVerticalGroup(
            panelModalidadPromociones1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelModalidadPromociones1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelModalidadPromociones1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnManejoPromociones1)
                    .addComponent(btnPromocionEstudiantil1))
                .addContainerGap(35, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout panelPromociones1Layout = new javax.swing.GroupLayout(panelPromociones1);
        panelPromociones1.setLayout(panelPromociones1Layout);
        panelPromociones1Layout.setHorizontalGroup(
            panelPromociones1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPromociones1Layout.createSequentialGroup()
                .addGroup(panelPromociones1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelPromociones1Layout.createSequentialGroup()
                        .addGap(24, 24, 24)
                        .addComponent(manejoCursos2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelPromociones1Layout.createSequentialGroup()
                        .addGap(33, 33, 33)
                        .addComponent(panelModalidadPromociones1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGroup(panelPromociones1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelPromociones1Layout.createSequentialGroup()
                        .addGap(64, 64, 64)
                        .addComponent(scrollPromocionesBusqueda1, javax.swing.GroupLayout.PREFERRED_SIZE, 350, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(scrollPromocionesEstBusqueda1, javax.swing.GroupLayout.PREFERRED_SIZE, 350, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPromociones1Layout.createSequentialGroup()
                        .addGap(39, 39, 39)
                        .addComponent(panelPromocionEstudiantil1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(14, Short.MAX_VALUE))
        );
        panelPromociones1Layout.setVerticalGroup(
            panelPromociones1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPromociones1Layout.createSequentialGroup()
                .addGap(42, 42, 42)
                .addGroup(panelPromociones1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(panelPromociones1Layout.createSequentialGroup()
                        .addGroup(panelPromociones1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(scrollPromocionesEstBusqueda1, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(scrollPromocionesBusqueda1, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(74, 74, 74)
                        .addComponent(panelPromocionEstudiantil1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelPromociones1Layout.createSequentialGroup()
                        .addComponent(panelModalidadPromociones1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(manejoCursos2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        panelOpciones.addTab("Sección de Promociones", panelPromociones1);

        jButton1.setText("Seccion de Alertas");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 358, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(890, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1)
                .addContainerGap(475, Short.MAX_VALUE))
        );

        panelOpciones.addTab("Seccion de Alertas", jPanel2);

        javax.swing.GroupLayout panelImagenEstudiante2Layout = new javax.swing.GroupLayout(panelImagenEstudiante2);
        panelImagenEstudiante2.setLayout(panelImagenEstudiante2Layout);
        panelImagenEstudiante2Layout.setHorizontalGroup(
            panelImagenEstudiante2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelImagenEstudiante2Layout.createSequentialGroup()
                .addContainerGap(19, Short.MAX_VALUE)
                .addComponent(panelOpciones, javax.swing.GroupLayout.PREFERRED_SIZE, 1263, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18))
        );
        panelImagenEstudiante2Layout.setVerticalGroup(
            panelImagenEstudiante2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelImagenEstudiante2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelOpciones, javax.swing.GroupLayout.PREFERRED_SIZE, 540, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(49, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelImagenEstudiante, javax.swing.GroupLayout.DEFAULT_SIZE, 1300, Short.MAX_VALUE)
            .addComponent(panelImagenEstudiante2, javax.swing.GroupLayout.DEFAULT_SIZE, 1300, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(panelImagenEstudiante, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelImagenEstudiante2, javax.swing.GroupLayout.PREFERRED_SIZE, 600, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-1316)/2, (screenSize.height-678)/2, 1316, 678);
    }// </editor-fold>//GEN-END:initComponents

    private void cerrarSesionMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cerrarSesionMouseEntered
        // TODO add your handling code here:
        Font font = new Font("Tahoma", Font.PLAIN, 11);
        Map attributes = font.getAttributes();
        attributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
        cerrarSesion.setFont(font.deriveFont(attributes));
        cerrarSesion.setForeground(new Color(0,0,204));
    }//GEN-LAST:event_cerrarSesionMouseEntered

    private void cerrarSesionMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cerrarSesionMouseExited
        // TODO add your handling code here:
        cerrarSesion.setFont(new Font("Tahoma", Font.PLAIN, 11));
        cerrarSesion.setForeground(new Color(0,0,0));
    }//GEN-LAST:event_cerrarSesionMouseExited

    private void cerrarSesionMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cerrarSesionMousePressed
        // TODO add your handling code here:
        VentanaPrincipal ob= new VentanaPrincipal();
        ob.setVisible(true);
        dispose();
    }//GEN-LAST:event_cerrarSesionMousePressed

    private void panelOpcionesStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_panelOpcionesStateChanged
        // TODO add your handling code here:
        Component comp = panelOpciones.getSelectedComponent();
        if (comp.equals(panelUsuarios)){
            cancelar();
            cargarUsuarios();
        }
        else{
            if (comp.equals(panelCursos)){
                cancelarCurso();
                cargarCursos();
            }
            else{
                if (comp.equals(panelMontos)){
                    salirSeccionMontos();
                    cargarMontos();
                }
                else{
                    if (comp.equals(panelPromociones)){
                        cancelarPromocion();
                        cargarPromociones();
                    }
                }
            }
        }
    }//GEN-LAST:event_panelOpcionesStateChanged

    private void btnCancelarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnCancelarMouseClicked
        // TODO add your handling code here:
        cancelar();
    }//GEN-LAST:event_btnCancelarMouseClicked

    private void btnActualizarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnActualizarMouseClicked
        // TODO add your handling code here:
        puedeActualizarUsuario();
    }//GEN-LAST:event_btnActualizarMouseClicked

    private void btnBusquedaMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnBusquedaMouseClicked
        // TODO add your handling code here:
        buscar(); 
    }//GEN-LAST:event_btnBusquedaMouseClicked

    private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEliminarActionPerformed
        // TODO add your handling code here:
        puedeEliminarUsuario();
    }//GEN-LAST:event_btnEliminarActionPerformed

    private void btnNuevoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNuevoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnNuevoActionPerformed

    private void btnNuevoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnNuevoMouseClicked
        // TODO add your handling code here:
        nuevo();
    }//GEN-LAST:event_btnNuevoMouseClicked

    private void btnAgregarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAgregarMouseClicked
        // TODO add your handling code here:
        puedeAgregarUsuario();
    }//GEN-LAST:event_btnAgregarMouseClicked

    private void campoContrasenaKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoContrasenaKeyTyped
        // TODO add your handling code here:
    }//GEN-LAST:event_campoContrasenaKeyTyped

    private void campoNuevaContrasenaKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoNuevaContrasenaKeyTyped
        // TODO add your handling code here:
    }//GEN-LAST:event_campoNuevaContrasenaKeyTyped

    private void btnActualizarMontoMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnActualizarMontoMousePressed
        // TODO add your handling code here:
        puedeActualizarMontos();
    }//GEN-LAST:event_btnActualizarMontoMousePressed

    private void rolAdminActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rolAdminActionPerformed
        // TODO add your handling code here:
        actualizarControles();
        if(rolAdmin.isEnabled()){
            rolEstandar.setSelected(false);
        }
    }//GEN-LAST:event_rolAdminActionPerformed

    private void rolEstandarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rolEstandarActionPerformed
        // TODO add your handling code here:
        actualizarControles();
        if(rolEstandar.isEnabled()){
            rolAdmin.setSelected(false);
        }
    }//GEN-LAST:event_rolEstandarActionPerformed

    private void campoIdKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoIdKeyReleased
        // TODO add your handling code here:
        if(unoNadaMas){
            idSorter();
        }  
    }//GEN-LAST:event_campoIdKeyReleased

    private void btnAyudaMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAyudaMouseClicked
        // TODO add your handling code here:
        mensajeAyudaPanelUsuarios();
    }//GEN-LAST:event_btnAyudaMouseClicked

    private void btnAyudaCursoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAyudaCursoMouseClicked
        // TODO add your handling code here:
        mensajeAyudaPanelCursos();
    }//GEN-LAST:event_btnAyudaCursoMouseClicked

    private void btnCancelarCursoMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnCancelarCursoMousePressed
        // TODO add your handling code here:
        cancelarCurso();
    }//GEN-LAST:event_btnCancelarCursoMousePressed

    private void btnEliminarCursoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEliminarCursoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnEliminarCursoActionPerformed

    private void btnEliminarCursoMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnEliminarCursoMousePressed
        // TODO add your handling code here:
        puedeEliminarCurso();
    }//GEN-LAST:event_btnEliminarCursoMousePressed

    private void btnBusquedaCursoMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnBusquedaCursoMousePressed
        // TODO add your handling code here:
        metodoBusquedaCurso();
    }//GEN-LAST:event_btnBusquedaCursoMousePressed

    private void btnAgregarCursoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAgregarCursoMouseClicked
        // TODO add your handling code here:
        puedeAgregarCurso();
    }//GEN-LAST:event_btnAgregarCursoMouseClicked

    private void btnNuevoCursoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnNuevoCursoMouseClicked
        // TODO add your handling code here:
        nuevoCurso();
    }//GEN-LAST:event_btnNuevoCursoMouseClicked

    private void btnNuevoCursoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNuevoCursoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnNuevoCursoActionPerformed

    private void btnActualizarCursoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnActualizarCursoMouseClicked
        // TODO add your handling code here:
        puedeActualizarCurso();
    }//GEN-LAST:event_btnActualizarCursoMouseClicked

    private void btnActualizarCursoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnActualizarCursoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnActualizarCursoActionPerformed

    private void btnAyudaCursoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAyudaCursoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnAyudaCursoActionPerformed

    private void campoCodigoCursoKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoCodigoCursoKeyTyped
        // TODO add your handling code here:
        char c = evt.getKeyChar();
        if(!((Character.isDigit(c))||(c == KeyEvent.VK_BACK_SPACE)||(c== KeyEvent.VK_DELETE))){
            getToolkit().beep();
            evt.consume();
        }
    }//GEN-LAST:event_campoCodigoCursoKeyTyped

    private void campoCursoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoCursoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_campoCursoActionPerformed

    private void campoCodigoCursoKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoCodigoCursoKeyReleased
        // TODO add your handling code here:
        if(unoNadaMas){
            codigoCursoSorter();
        }
    }//GEN-LAST:event_campoCodigoCursoKeyReleased

    private void campoCursoKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoCursoKeyReleased
        // TODO add your handling code here:
        if(unoNadaMas){
            nombreCursoSorter();
        }
    }//GEN-LAST:event_campoCursoKeyReleased

    private void estadoActivoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_estadoActivoMouseClicked
        // TODO add your handling code here:
        actualizarControlesCursos();
        if(estadoActivo.isEnabled()){
            estadoDesactivo.setSelected(false);
        }
    }//GEN-LAST:event_estadoActivoMouseClicked

    private void estadoDesactivoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_estadoDesactivoMouseClicked
        // TODO add your handling code here:
        actualizarControlesCursos();
        if(estadoDesactivo.isEnabled()){
            estadoActivo.setSelected(false);
        }
    }//GEN-LAST:event_estadoDesactivoMouseClicked

    private void campoActualizarMontoKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoActualizarMontoKeyTyped
        // TODO add your handling code here:
        char c = evt.getKeyChar();
        if(!((Character.isDigit(c))||(c == KeyEvent.VK_BACK_SPACE)||(c== KeyEvent.VK_DELETE))){
            getToolkit().beep();
            evt.consume();
        }
    }//GEN-LAST:event_campoActualizarMontoKeyTyped

    private void btnAyudaMontoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAyudaMontoMouseClicked
        // TODO add your handling code here:
        mensajeAyudaPanelMontos();
    }//GEN-LAST:event_btnAyudaMontoMouseClicked

    private void btnAyudaMontoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAyudaMontoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnAyudaMontoActionPerformed

    private void btnNuevoPromocion1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnNuevoPromocion1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnNuevoPromocion1MousePressed

    private void campoCodigoPromocion1KeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoCodigoPromocion1KeyReleased
        // TODO add your handling code here:
    }//GEN-LAST:event_campoCodigoPromocion1KeyReleased

    private void campoCodigoPromocion1KeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoCodigoPromocion1KeyTyped
        // TODO add your handling code here:
    }//GEN-LAST:event_campoCodigoPromocion1KeyTyped

    private void campoPromocion1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoPromocion1ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_campoPromocion1ActionPerformed

    private void btnAgregarPromocion1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAgregarPromocion1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnAgregarPromocion1MousePressed

    private void btnBusquedaPromocion1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnBusquedaPromocion1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnBusquedaPromocion1MousePressed

    private void btnEliminarPromocion1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnEliminarPromocion1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnEliminarPromocion1MousePressed

    private void btnEliminarPromocion1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEliminarPromocion1ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnEliminarPromocion1ActionPerformed

    private void btnCancelarPromocion1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnCancelarPromocion1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnCancelarPromocion1MousePressed

    private void btnAsignarPromocion1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAsignarPromocion1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnAsignarPromocion1MousePressed

    private void btnAsignarPromocion1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAsignarPromocion1ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnAsignarPromocion1ActionPerformed

    private void btnDesasignarPromocion1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnDesasignarPromocion1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnDesasignarPromocion1MousePressed

    private void btnDesasignarPromocion1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDesasignarPromocion1ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnDesasignarPromocion1ActionPerformed

    private void btnBusquedaPromocionEstudiantil1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnBusquedaPromocionEstudiantil1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnBusquedaPromocionEstudiantil1MousePressed

    private void btnBusquedaPromocionEstudiantil1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBusquedaPromocionEstudiantil1ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnBusquedaPromocionEstudiantil1ActionPerformed

    private void campoBusquedaPromocionEstudiantil1KeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoBusquedaPromocionEstudiantil1KeyReleased
        // TODO add your handling code here:
    }//GEN-LAST:event_campoBusquedaPromocionEstudiantil1KeyReleased

    private void btnCancelarPromocionEstudiantil1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnCancelarPromocionEstudiantil1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnCancelarPromocionEstudiantil1MousePressed

    private void fechaInicioPromocion1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fechaInicioPromocion1ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_fechaInicioPromocion1ActionPerformed

    private void fechaInicioPromocion1KeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fechaInicioPromocion1KeyTyped
        // TODO add your handling code here:
    }//GEN-LAST:event_fechaInicioPromocion1KeyTyped

    private void fechaExpiracionPromocion1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fechaExpiracionPromocion1ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_fechaExpiracionPromocion1ActionPerformed

    private void fechaExpiracionPromocion1KeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_fechaExpiracionPromocion1KeyTyped
        // TODO add your handling code here:
    }//GEN-LAST:event_fechaExpiracionPromocion1KeyTyped

    private void btnManejoPromociones1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnManejoPromociones1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnManejoPromociones1MousePressed

    private void btnPromocionEstudiantil1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnPromocionEstudiantil1MousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnPromocionEstudiantil1MousePressed

    private void btnBusquedaPromocionMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnBusquedaPromocionMousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnBusquedaPromocionMousePressed

    private void btnEliminarPromocionMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnEliminarPromocionMousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnEliminarPromocionMousePressed

    private void btnEliminarPromocionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEliminarPromocionActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnEliminarPromocionActionPerformed

    private void btnCancelarPromocionMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnCancelarPromocionMousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnCancelarPromocionMousePressed

    private void btnAyudaPromocionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAyudaPromocionMouseClicked
        // TODO add your handling code here:
        mensajeAyudaPanelPromociones();
    }//GEN-LAST:event_btnAyudaPromocionMouseClicked

    private void btnAyudaPromocionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAyudaPromocionActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnAyudaPromocionActionPerformed

    private void btnActualizarPromocionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnActualizarPromocionMouseClicked
        // TODO add your handling code here:
        puedeActualizarPromocion();
    }//GEN-LAST:event_btnActualizarPromocionMouseClicked

    private void btnActualizarPromocionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnActualizarPromocionActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnActualizarPromocionActionPerformed

    private void btnAgregarPromocionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAgregarPromocionMouseClicked
        // TODO add your handling code here:
        puedeAgregarPromocion();
    }//GEN-LAST:event_btnAgregarPromocionMouseClicked

    private void btnNuevoPromocionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnNuevoPromocionMouseClicked
        // TODO add your handling code here:
        nuevoPromocion();
    }//GEN-LAST:event_btnNuevoPromocionMouseClicked

    private void btnNuevoPromocionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNuevoPromocionActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnNuevoPromocionActionPerformed

    private void campoCodigoPromocionKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoCodigoPromocionKeyReleased
        // TODO add your handling code here:
        if(unoNadaMas){
            codigoPromocionSorter();
        }
    }//GEN-LAST:event_campoCodigoPromocionKeyReleased

    private void campoCodigoPromocionKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoCodigoPromocionKeyTyped
        // TODO add your handling code here:
        char c = evt.getKeyChar();
        if(!((Character.isDigit(c))||(c == KeyEvent.VK_BACK_SPACE)||(c== KeyEvent.VK_DELETE))){
            getToolkit().beep();
            evt.consume();
        }
    }//GEN-LAST:event_campoCodigoPromocionKeyTyped

    private void campoPromocionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoPromocionActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_campoPromocionActionPerformed

    private void campoPromocionKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoPromocionKeyReleased
        // TODO add your handling code here:
        if(unoNadaMas){
            nombrePromocionSorter();
        }
    }//GEN-LAST:event_campoPromocionKeyReleased

    private void estadoActivoPromocionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_estadoActivoPromocionMouseClicked
        // TODO add your handling code here:
        actualizarControlesPromociones();
        if(estadoActivoPromocion.isEnabled()){
            estadoDesactivoPromocion.setSelected(false);
        }
    }//GEN-LAST:event_estadoActivoPromocionMouseClicked

    private void estadoDesactivoPromocionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_estadoDesactivoPromocionMouseClicked
        // TODO add your handling code here:
        actualizarControlesPromociones();
        if(estadoDesactivoPromocion.isEnabled()){
            estadoActivoPromocion.setSelected(false);
        }
    }//GEN-LAST:event_estadoDesactivoPromocionMouseClicked

    private void btnAgregarPromocionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAgregarPromocionActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnAgregarPromocionActionPerformed

    private void campoMontoPromocionKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoMontoPromocionKeyReleased
        // TODO add your handling code here:
    }//GEN-LAST:event_campoMontoPromocionKeyReleased

    private void campoMontoPromocionKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoMontoPromocionKeyTyped
        // TODO add your handling code here:
        char c = evt.getKeyChar();
        if(!((Character.isDigit(c))||(c == KeyEvent.VK_BACK_SPACE)||(c== KeyEvent.VK_DELETE))){
            getToolkit().beep();
            evt.consume();
        }
    }//GEN-LAST:event_campoMontoPromocionKeyTyped

    private void btnBusquedaPromocionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnBusquedaPromocionMouseClicked
        // TODO add your handling code here:
        metodoBusquedaPromocion();
    }//GEN-LAST:event_btnBusquedaPromocionMouseClicked

    private void btnEliminarPromocionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnEliminarPromocionMouseClicked
        // TODO add your handling code here:
        puedeEliminarPromocion();
    }//GEN-LAST:event_btnEliminarPromocionMouseClicked

    private void btnCancelarPromocionMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnCancelarPromocionMouseClicked
        // TODO add your handling code here:
        cancelarPromocion();
    }//GEN-LAST:event_btnCancelarPromocionMouseClicked

    private void checkTotalMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_checkTotalMouseClicked
        // TODO add your handling code here:
        actualizarControlesPromociones();
        if(checkTotal.isEnabled()){
            checkDigitado.setSelected(false);
            monto.setVisible(false);
            astMontoPromocion.setVisible(false);
            campoMontoPromocion.setText("");
            campoMontoPromocion.setVisible(false);

        }
    }//GEN-LAST:event_checkTotalMouseClicked

    private void checkDigitadoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_checkDigitadoMouseClicked
        // TODO add your handling code here:
        actualizarControlesPromociones();
        if(checkDigitado.isEnabled()){
            if(checkDigitado.isSelected()){
                checkTotal.setSelected(false);
                monto.setVisible(true);
                astMontoPromocion.setVisible(true);
                campoMontoPromocion.setBackground(Color.white);
                campoMontoPromocion.setVisible(true);
                campoMontoPromocion.requestFocus();
            }
        }
    }//GEN-LAST:event_checkDigitadoMouseClicked

    private void mensajeAyudaPanelUsuarios(){
        JOptionPane.showMessageDialog(null, 
                "\n1- Para añadir un usuario es necesario presionar el botón 'nuevo', luego ingresar los datos en los campos requeridos"
              + "\ny presionar el botón 'agregar' para confirmar que se añadirá el usuario al sistema. Para salir del modo agregar se"
              + "\ndebe presionar en el botón cancelar."
              + "\n"
              + "\n2- Para actualizar algún usuario primero se debe escoger el usuario en la tabla que se encuentra al lado derecho de"
              + "\nesta sección. Una vez seleccionado, aparece una pequeña ventana para confirmar qué hacer con el usuario escodigo."
              + "\nEntre las opciones se encuentran 'actualizar' y 'eliminar', por lo que se confirma que se actualizará dicho usuario."
              + "\nLuego se mostrará habilitada la opción de actualizar el usuario seleccionado, mediante la opción del botón llamado"
              + "\n'actualizar', y se prosigue con actualizar los campos necesarios que se quieran modificar del usuario, ya sea la"
              + "\ncontraseña o el rol del usuario. Por último se presiona el botón 'actualizar' para confirmar los cambios en el"
              + "\nusuario seleccionado. Para salir del modo actualizar se presiona el botón 'cancelar'."
              + "\n"
              + "\n3- Para buscar un usuario específico, primero se procede a presionar el botón 'búsqueda' que habilitará el espacio"
              + "\nespecificado y requerido del ID de usuario para buscarlo bajo ese criterio en dicho campo. Así, la tabla donde se"
              + "\nencuentran los usuarios del sistema se irán filtrando conforme la persona digite en el campo de ID de usuario el "
              + "\nusuario que desee encontrar. Para salir del modo búsqueda se presiona el botón 'cancelar'. El modo búsqueda puede"
              + "\nentrar en el modo actualizar o eliminar dependiendo si en la busqueda la persona eligió un usuario de la tabla."
              + "\n"
              + "\n4- Para eliminar algún usuario primero se debe escoger el usuario en la tabla que se encuentra al lado derecho de"
              + "\nesta sección. Una vez seleccionado, aparece una pequeña ventana para confirmar qué hacer con el usuario escodigo."
              + "\nEntre las opciones se encuentran 'actualizar' y 'eliminar', por lo que se confirma que se entrará en el modo"
              + "\neliminar. Luego se mostrará habilitada la opción de eliminar el usuario seleccionado, mediante la opción del botón"
              + "\nllamado 'eliminar'. Por último se prosigue a presionar el botón 'eliminar' y confirmar que se eliminará dicho"
              + "\nusuario. Para salir del modo eliminar se presiona en el botón 'eliminar'."
              + "\n"
              + "\n5- Para salir de algún estado de edición basta con presionar el botón 'cancelar'.", "¿Qué hacer?", JOptionPane.INFORMATION_MESSAGE);
    }
    
    private void idSorter(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaUsuarios.getModel());
        tablaUsuarios.setRowSorter(sorter);
        if(campoId.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoId.getText(),0));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
    private void noModifyPass(){
        contrasena.setText("Contraseña:");
    }
    
    private void modifyPass(){
        contrasena.setText("Nueva contraseña:");
    }
    
    private void nuevo(){
        if(btnNuevo.isEnabled()){
            edicion.setText("Edición: agregar");
            astUsuario.setVisible(true);
            campoId.setEnabled(true);
            campoId.requestFocus();
            campoId.setEditable(true);
            campoId.setBackground(Color.white);
            astContrasena.setVisible(true);
            campoContrasena.setEnabled(true);
            campoContrasena.setEditable(true);
            campoContrasena.setBackground(Color.white);
            astNuevaContrasena.setVisible(true);
            campoNuevaContrasena.setEnabled(true);
            campoNuevaContrasena.setEditable(true);
            campoNuevaContrasena.setBackground(Color.white);
            astRol.setVisible(true);
            rolAdmin.setEnabled(true);
            rolEstandar.setEnabled(true);
            btnNuevo.setEnabled(false);
            btnBusqueda.setEnabled(false);
            btnEliminar.setEnabled(false);
            btnCancelar.setEnabled(true);
            tablaUsuarios.clearSelection();
            tablaUsuarios.setRowSelectionAllowed(false);
            unoNadaMas=false;
        }
    }
    
    private void puedeAgregarUsuario(){
        if(btnAgregar.isEnabled()){
            if(filtrosUsuario()){
                agregar();
            }
        }
    }
    
    private boolean filtrosUsuario(){
        int filtro1,filtro2,filtro3,filtro4,filtro5;
        filtro1=filtro2=filtro3=filtro4=filtro5=0;
        if(!maxLargoId()||!minLargoId()){
            filtro1=1;
        }
        if(!maxLargoContrasena()||!minLargoContrasena()){
            filtro2=1;
        }
        if(!maxLargoContrasenaNueva()||!minLargoContrasenaNueva()){
            filtro3=1;
        }
        if(!seguridadContrasena(campoContrasena.getText())){
            filtro4=1;
        }
        if(!seguridadContrasena(campoContrasena.getText())){
            filtro5=1;
        }
        return filtroAvisosUsuario(filtro1,filtro2,filtro3,filtro4,filtro5);
    }
    
    private boolean filtroAvisosUsuario(int filtro1, int filtro2, int filtro3, int filtro4, int filtro5){
        if(filtro1==0){
            if(filtro2==0){
                if(filtro3==0){
                    if(filtro4==0){
                        if(filtro5==0){
                            subrayadoErrorUsuario(0,0,0,0,0);
                            return true;
                        }
                        else{
                            avisoLargo1();
                            return false;
                        }
                    }
                    else{
                        if(filtro5==0){
                            avisoLargo2();
                            return false;
                        }
                        else{
                            avisoLargo3();
                            return false;
                        }
                    }
                }
                else{
                    if(filtro4==0){
                        if(filtro5==0){
                            avisoLargo4();
                            return false;
                        }
                        else{
                            avisoLargo5();
                            return false;
                        }
                    }
                    else{
                        if(filtro5==0){
                            avisoLargo6();
                            return false;
                        }
                        else{
                            avisoLargo7();
                            return false;
                        }
                    }
                }
            }
            else{
                if(filtro3==0){
                    if(filtro4==0){
                        if(filtro5==0){
                            avisoLargo8();
                            return false;
                        }
                        else{
                            avisoLargo9();
                            return false;
                        }
                    }
                    else{
                        if(filtro5==0){
                            avisoLargo10();
                            return false;
                        }
                        else{
                            avisoLargo11();
                            return false;
                        }
                    }
                }
                else{
                    if(filtro4==0){
                        if(filtro5==0){
                            avisoLargo12();
                            return false;
                        }
                        else{
                            avisoLargo13();
                            return false;
                        }
                    }
                    else{
                        if(filtro5==0){
                            avisoLargo14();
                            return false;
                        }
                        else{
                            avisoLargo15();
                            return false;
                        }
                    }
                }
            }
        }
        else{
            if(filtro2==0){
                if(filtro3==0){
                    if(filtro4==0){
                        if(filtro5==0){
                            avisoLargo16();
                            return false;
                        }
                        else{
                            avisoLargo17();
                            return false;
                        }
                    }
                    else{
                        if(filtro5==0){
                            avisoLargo18();
                            return false;
                        }
                        else{
                            avisoLargo19();
                            return false;
                        }
                    }
                }
                else{
                    if(filtro4==0){
                        if(filtro5==0){
                            avisoLargo20();
                            return false;
                        }
                        else{
                            avisoLargo21();
                            return false;
                        }
                    }
                    else{
                        if(filtro5==0){
                            avisoLargo22();
                            return false;
                        }
                        else{
                            avisoLargo23();
                            return false;
                        }
                    }
                }
            }
            else{
                if(filtro3==0){
                    if(filtro4==0){
                        if(filtro5==0){
                            avisoLargo24();
                            return false;
                        }
                        else{
                            avisoLargo25();
                            return false;
                        }
                    }
                    else{
                        if(filtro5==0){
                            avisoLargo26();
                            return false;
                        }
                        else{
                            avisoLargo27();
                            return false;
                        }
                    }
                }
                else{
                    if(filtro4==0){
                        if(filtro5==0){
                            avisoLargo28();
                            return false;
                        }
                        else{
                            avisoLargo29();
                            return false;
                        }
                    }
                    else{
                        if(filtro5==0){
                            avisoLargo30();
                            return false;
                        }
                        else{
                            avisoLargo31();
                            return false;
                        }
                    }
                }
            }
        }
    }
    
    private boolean maxLargoId(){
        if(campoId.getText().length()<9){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean minLargoId(){
        if(campoId.getText().length()>3){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean maxLargoContrasena(){
        if(campoContrasena.getText().length()<16){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean minLargoContrasena(){
        if(campoContrasena.getText().length()>7){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean maxLargoContrasenaNueva(){
        if(campoNuevaContrasena.getText().length()<16){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean minLargoContrasenaNueva(){
        if(campoNuevaContrasena.getText().length()>7){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean seguridadContrasena(String passwd){
        if (!passwd.matches(".*[A-Z].*")){
            return false;
        }
        else{
            if (!passwd.matches(".*[a-z].*")){
                return false;
            }
            else{
                if (!passwd.matches(".*[0-9].*")){
                    return false;
                }
                else{
                    return true;
                }
            }
        } 
    }
    
    private void avisoLargo1(){ //0-0-0-0-1
        subrayadoErrorUsuario(0,0,0,0,1);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo2(){ //0-0-0-1-0
        subrayadoErrorUsuario(0,0,0,1,0);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo3(){ //0-0-0-1-1
        subrayadoErrorUsuario(0,0,0,1,1);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo4(){ //0-0-1-0-0
        subrayadoErrorUsuario(0,0,1,0,0);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo5(){ //0-0-1-0-1
        subrayadoErrorUsuario(0,0,1,0,1);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo6(){ //0-0-1-1-0
        subrayadoErrorUsuario(0,0,1,1,0);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo7(){ //0-0-1-1-1
        subrayadoErrorUsuario(0,0,1,1,1);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo8(){ //0-1-0-0-0
        subrayadoErrorUsuario(0,1,0,0,0);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo9(){ //0-1-0-0-1
        subrayadoErrorUsuario(0,1,0,0,1);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo10(){ //0-1-0-1-0
        subrayadoErrorUsuario(0,1,0,1,0);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo11(){ //0-1-0-1-1
        subrayadoErrorUsuario(0,1,0,1,1);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo12(){ //0-1-1-0-0
        subrayadoErrorUsuario(0,1,1,0,0);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo13(){ //0-1-1-0-1
        subrayadoErrorUsuario(0,1,1,0,1);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo14(){ //0-1-1-1-0
        subrayadoErrorUsuario(0,1,1,1,0);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo15(){ //0-1-1-1-1
        subrayadoErrorUsuario(0,1,1,1,1);
        JOptionPane.showMessageDialog(null, "\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
            
    private void avisoLargo16(){ //1-0-0-0-0
        subrayadoErrorUsuario(1,0,0,0,0);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo17(){ //1-0-0-0-1
        subrayadoErrorUsuario(1,0,0,0,1);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo18(){ //1-0-0-1-0
        subrayadoErrorUsuario(1,0,0,1,0);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo19(){ //1-0-0-1-1
        subrayadoErrorUsuario(1,0,0,1,1);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo20(){ //1-0-1-0-0
        subrayadoErrorUsuario(1,0,1,0,0);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo21(){ //1-0-1-0-1
        subrayadoErrorUsuario(1,0,1,0,1);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo22(){ //1-0-1-1-0
        subrayadoErrorUsuario(1,0,1,1,0);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo23(){ //1-0-1-1-1
        subrayadoErrorUsuario(1,0,1,1,1);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo24(){ //1-1-0-0-0
        subrayadoErrorUsuario(1,1,0,0,0);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo25(){ //1-1-0-0-1
        subrayadoErrorUsuario(1,1,0,0,1);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo26(){ //1-1-0-1-0
        subrayadoErrorUsuario(1,1,0,1,0);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo27(){ //1-1-0-1-1
        subrayadoErrorUsuario(1,1,0,1,1);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo28(){ //1-1-1-0-0
        subrayadoErrorUsuario(1,1,1,0,0);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo29(){ //1-1-1-0-1
        subrayadoErrorUsuario(1,1,1,0,1);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo30(){ //1-1-1-1-0
        subrayadoErrorUsuario(1,1,1,1,0);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargo31(){ //1-1-1-1-1
        subrayadoErrorUsuario(1,1,1,1,1);
        JOptionPane.showMessageDialog(null, "\nEl ID de usuario no puede tener más de 8 y no menos de 4 caracteres\nLa contraseña de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de confirmación de usuario no puede tener más de 15 y no menos de 8 caracteres\nLa contraseña de usuario debe estar conformada por minúsculas,mayúsculas y números\nLa contraseña de confirmación de usuario debe estar conformada por minúsculas,mayúsculas y números", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void subrayadoErrorUsuario(int filtro1, int filtro2, int filtro3, int filtro4, int filtro5){
        if(filtro1==1){
            campoId.setBackground(new Color(255,51,51));
            campoId.setToolTipText("Revisar nombre de usuario");
        }
        if(filtro1==0){
            if(btnAgregar.isEnabled()){
                campoId.setBackground(Color.white);
            }
            else{
                if(btnActualizar.isEnabled()){
                    campoId.setBackground(new Color(240,240,240));
                }
            }
            campoId.setToolTipText(null);
        }
        if(filtro2==1||filtro4==1){
            campoContrasena.setBackground(new Color(255,51,51));
            campoContrasena.setToolTipText("Revisar contraseña de usuario");
        }
        if(filtro2==0&&filtro4==0){
            campoContrasena.setBackground(Color.white);
            campoContrasena.setToolTipText(null);
        }
        if(filtro3==1||filtro5==1){
            campoNuevaContrasena.setBackground(new Color(255,51,51));
            campoNuevaContrasena.setToolTipText("Revisar contraseña de confirmación de usuario");
        }
        if(filtro3==0&&filtro5==0){
            campoNuevaContrasena.setBackground(Color.white);
            campoNuevaContrasena.setToolTipText(null);
        }
    }
    
    private void contrasenasIncorrectas(){
        campoContrasena.setBackground(Color.red);
        campoContrasena.setToolTipText("Revisar contraseña de usuario");
        campoNuevaContrasena.setBackground(Color.red);
        campoNuevaContrasena.setToolTipText("Revisar contraseña de confirmación de usuario");
    }
    
    private void elegirActualizarEliminar(){
        int elegir = JOptionPane.showOptionDialog(
            null,"Elija que desea realizar con el usuario: "+tablaUsuarios.getValueAt(tablaUsuarios.getSelectedRow(), 0), "Acción requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
            null,    // null para icono por defecto.
            new Object[] { "Actualizar", "Eliminar"},   // null para YES, NO y CANCEL
            null);
        
        if(elegir==0){//habilitar actualizar usuario
            actualizar();
        }
        else{//habilitar eliminar usuario
            if(elegir==1){
                eliminar();
            }
        }
        
    }
    
    private void agregar(){
        
        if(!campoContrasena.getText().equals(campoNuevaContrasena.getText())){
            contrasenasIncorrectas();
            JOptionPane.showMessageDialog(null, "\n Ambos espacios de contraseñas no coinciden \n Por favor confirmar la contraseña correctamente", "Aviso", JOptionPane.INFORMATION_MESSAGE);
        }
        else{
        
            int confirmado = JOptionPane.showOptionDialog(
                null,"Usuario: "+campoId.getText()+"\n \nConfirmar creación de usuario", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
            
                    if(rolAdmin.isSelected()){ //si es administrador ejecutamos
                        String consultaSQL = "insert into usuario (contrasena,ultimo_acceso,id,rol) VALUES ('"+campoContrasena.getText()+"',"+"NULL"+",'"+campoId.getText()+"','a')";
                        resultado = sentencia.executeQuery(consultaSQL);
                    
                    }
                    else{
                        String consultaSQL = "insert into usuario (contrasena,ultimo_acceso,id,rol) VALUES ('"+campoContrasena.getText()+"',"+"NULL"+",'"+campoId.getText()+"','e')";
                        resultado = sentencia.executeQuery(consultaSQL);
                    }
                

                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        JOptionPane.showMessageDialog(null,"\n ¡Usuario "+campoId.getText()+" añadido al sistema!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                        if(rolAdmin.isSelected()){
                            ((DefaultTableModel)tablaUsuarios.getModel()).addRow(new Object[]{campoId.getText(), "administrador(a)", null});
                        }
                        else{
                            ((DefaultTableModel)tablaUsuarios.getModel()).addRow(new Object[]{campoId.getText(), "estandar", null});
                        }
                        añadido();
                    }
                    else{       
                        if(e.getSQLState().equals("23505")){ //unique violation: llave duplicada
                            JOptionPane.showMessageDialog(null, "\n Imposible añadir usuario \n Un usuario con dicho ID ya ha sido registrado, por favor asegúrese de ingresar correctamete los datos", "Error", JOptionPane.ERROR_MESSAGE); 
                        }
                        else{
                            JOptionPane.showMessageDialog(null, "\n Imposible añadir usuario \n Por favor ingresar los datos correctamente", "Error", JOptionPane.ERROR_MESSAGE);
                            e.printStackTrace();
                            conexion = null;
                        }
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    
    private void puedeActualizarUsuario(){
        if(btnActualizar.isEnabled()){
            if(campoContrasena.getText().equals("") && campoNuevaContrasena.getText().equals("")){
                actualizarUsuario(0);
            }
            else{
                if(filtrosUsuario()){
                    actualizarUsuario(1);
                }
            }
        }
    }
    
    private void actualizarUsuario(int passAct){
        if(!campoContrasena.getText().equals(campoNuevaContrasena.getText())){
            contrasenasIncorrectas();
            JOptionPane.showMessageDialog(null, "\n Ambos espacios de contraseñas no coinciden \n Por favor confirmar la contraseña correctamente", "Aviso", JOptionPane.INFORMATION_MESSAGE);
        }
        else{
        
            int confirmado = JOptionPane.showOptionDialog(
                null,"Confirmar actualización del usuario: "+campoId.getText().replaceAll("\\s+","")+"\n \nConfirmación requerida", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
                    String consultaSQL;
                    if(rolAdmin.isSelected()){ //si es administrador ejecutamos
                        if(passAct==0){
                            consultaSQL = "update usuario set rol='a' where id='"+campoId.getText().replaceAll("\\s+","")+"'";
                        }
                        else{
                            consultaSQL = "update usuario set contrasena='"+campoContrasena.getText().replaceAll("\\s+","")+"',rol='a' where id='"+campoId.getText().replaceAll("\\s+","")+"'";
                        }
                    }
                    else{
                        if(passAct==0){
                            consultaSQL = "update usuario set rol='e' where id='"+campoId.getText().replaceAll("\\s+","")+"'";
                        }
                        else{
                            consultaSQL = "update usuario set contrasena='"+campoContrasena.getText().replaceAll("\\s+","")+"',rol='e' where id='"+campoId.getText().replaceAll("\\s+","")+"'";
                        }
                    }
                    
                    resultado = sentencia.executeQuery(consultaSQL);

                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una actualización no devuelve nada
                        if(rolAdmin.isSelected()){
                            tablaUsuarios.setValueAt("administrador(a)", tablaUsuarios.getSelectedRow(), 1);
                        }
                        else{
                            tablaUsuarios.setValueAt("estandar", tablaUsuarios.getSelectedRow(), 1);
                        }
                        actualizado();
                        JOptionPane.showMessageDialog(null,"\n ¡Usuario "+campoId.getText().replaceAll("\\s+","")+" actualizado!","Éxito",JOptionPane.INFORMATION_MESSAGE);                        
                    }
                    else{       
                        JOptionPane.showMessageDialog(null, "\n Imposible actualizar usuario \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                        e.printStackTrace();
                        conexion = null;
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    
    private boolean eliminaASiMismo(){
        if(usuario.getText().equals(tablaUsuarios.getValueAt(tablaUsuarios.getSelectedRow(), 0))){
            return true;
        }
        else{
            return false;
        }
    }
    
    private void puedeEliminarUsuario(){
        if(btnEliminar.isEnabled()){
            if(tablaUsuarios.getSelectedColumn()!=-1){
                eliminarUsuario();
            }
            else{
                JOptionPane.showMessageDialog(null, "\nNingún usuario qué seleccionar para eliminar, por favor de click en el botón 'cancelar'", "Error", JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }
    
    private void eliminarUsuario(){
        
        if(eliminaASiMismo()){
            JOptionPane.showMessageDialog(null, "\n Imposible eliminar usuario del sistema\n No se puede borrar así mismo", "Error", JOptionPane.ERROR_MESSAGE);
        }
        else{
        
            int confirmado = JOptionPane.showOptionDialog(
                null,"Usuario: "+tablaUsuarios.getValueAt(tablaUsuarios.getSelectedRow(), 0)+"\n \nConfirmar eliminación de usuario", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
                    String consultaSQL = "delete from usuario where id='"+((String)tablaUsuarios.getValueAt(tablaUsuarios.getSelectedRow(), 0)).replaceAll("\\s+","")+"'";
                    resultado = sentencia.executeQuery(consultaSQL);
                        
                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        String user=((String)tablaUsuarios.getValueAt(tablaUsuarios.getSelectedRow(), 0)).replaceAll("\\s+","");
                        ((DefaultTableModel)tablaUsuarios.getModel()).removeRow(tablaUsuarios.convertRowIndexToModel(tablaUsuarios.getSelectedRow()));
                        JOptionPane.showMessageDialog(null,"\n ¡Usuario "+user+" eliminado del sistema!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                        eliminado();
                    }
                    else{       
                        JOptionPane.showMessageDialog(null, "\n Imposible eliminar usuario del sistema\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                        e.printStackTrace();
                        conexion = null;
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    
    private void añadido(){
        campoId.setText("");
        campoId.requestFocus();
        campoContrasena.setText("");
        campoNuevaContrasena.setText("");
        rolAdmin.setSelected(false);
        rolEstandar.setSelected(false);
        tablaUsuarios.clearSelection();
    }
    
    private void actualizado(){
        campoId.setBackground(new Color(240,240,240));
        campoContrasena.setText("");
        campoContrasena.requestFocus();
        campoNuevaContrasena.setText("");
    }
    
    private void eliminado(){
        tablaUsuarios.clearSelection();
    }
    
    private void cancelar(){
        if(btnCancelar.isEnabled()){
            btnNuevo.setEnabled(true);
            btnAgregar.setEnabled(false);
            btnBusqueda.setEnabled(true);
            btnEliminar.setEnabled(false);
            btnActualizar.setEnabled(false);
            astUsuario.setVisible(false);
            campoId.setToolTipText(null);
            campoId.setBackground(new Color(240,240,240));
            campoId.setEnabled(false);
            campoId.setText(null);
            campoId.setEditable(false);
            astContrasena.setVisible(false);
            campoContrasena.setToolTipText(null);
            campoContrasena.setBackground(new Color(240,240,240));
            campoContrasena.setEnabled(false);
            campoContrasena.setText(null);
            campoContrasena.setEditable(false);
            astNuevaContrasena.setVisible(false);
            campoNuevaContrasena.setToolTipText(null);
            campoNuevaContrasena.setBackground(new Color(240,240,240));
            campoNuevaContrasena.setEnabled(false);
            campoNuevaContrasena.setText(null);
            campoNuevaContrasena.setEditable(false);
            noModifyPass();
            astRol.setVisible(false);
            rolAdmin.setSelected(false);
            rolAdmin.setEnabled(false);
            rolEstandar.setSelected(false);
            rolEstandar.setEnabled(false);
            btnCancelar.setEnabled(false);
            tablaUsuarios.clearSelection();
            tablaUsuarios.setRowSelectionAllowed(true);
            edicion.setText("Edición: esperando...");
            idSorter();
            unoNadaMas=false;
        }
    }
    
    private void buscar(){
        if(btnBusqueda.isEnabled()){
            edicion.setText("Edición: búsqueda");
            btnNuevo.setEnabled(false);
            btnCancelar.setEnabled(true);
            btnBusqueda.setEnabled(false);
            astUsuario.setVisible(true);
            campoId.setBackground(Color.white);
            campoId.setEditable(true);
            campoId.setEnabled(true);
            campoId.requestFocus();
            tablaUsuarios.clearSelection();
            unoNadaMas=true;
        }
    }
    
    private void actualizar(){
        edicion.setText("Edición: actualizar");
        btnNuevo.setEnabled(false);
        btnActualizar.setEnabled(true);
        btnBusqueda.setEnabled(false);
        btnEliminar.setEnabled(false);
        btnCancelar.setEnabled(true);
        if(!((String)tablaUsuarios.getValueAt(tablaUsuarios.getSelectedRow(), 0)).replaceAll("\\s+","").equals(campoId.getText().replaceAll("\\s+",""))){
            campoContrasena.setText("");
            campoNuevaContrasena.setText("");
        }
        astUsuario.setVisible(false);
        campoId.setBackground(new Color(240,240,240));
        campoId.setEnabled(false);
        campoId.setText(tablaUsuarios.getValueAt(tablaUsuarios.getSelectedRow(), 0)+"");
        modifyPass();
        campoContrasena.setToolTipText(null);
        campoContrasena.setEnabled(true);
        campoContrasena.setBackground(Color.white);
        campoContrasena.setEditable(true);
        campoContrasena.requestFocus();
        campoNuevaContrasena.setToolTipText(null);
        campoNuevaContrasena.setEnabled(true);
        campoNuevaContrasena.setBackground(Color.white);
        campoNuevaContrasena.setEditable(true);
        if(((String)tablaUsuarios.getValueAt(tablaUsuarios.getSelectedRow(), 1)).replaceAll("\\s+","").equals("administrador(a)")){
            rolAdmin.setSelected(true);
            rolEstandar.setSelected(false);
        }
        else{
            rolAdmin.setSelected(false);
            rolEstandar.setSelected(true);
        }
        rolAdmin.setEnabled(true);
        rolEstandar.setEnabled(true);
    }
    
    private void eliminar(){
        edicion.setText("Edición: eliminar");
        btnEliminar.setEnabled(true);
        btnActualizar.setEnabled(false);
        astUsuario.setVisible(true);
        astUsuario.setVisible(false);
        campoId.setBackground(new Color(240,240,240));
        campoId.setEnabled(false);
        campoId.setText("");
        campoContrasena.setToolTipText(null);
        campoContrasena.setBackground(new Color(240,240,240));
        campoContrasena.setText("");
        campoContrasena.setEnabled(false);
        campoNuevaContrasena.setToolTipText(null);
        campoNuevaContrasena.setBackground(new Color(240,240,240));
        campoNuevaContrasena.setText("");
        campoNuevaContrasena.setEnabled(false);
        rolAdmin.setSelected(false);
        rolAdmin.setEnabled(false);
        rolEstandar.setSelected(false);
        rolEstandar.setEnabled(false);
    }
    
    private void puedeAgregar(){
        if(!campoId.getText().equals("") && !campoContrasena.getText().equals("") && !campoNuevaContrasena.getText().equals("") && (rolAdmin.isSelected() || rolEstandar.isSelected())){
            btnAgregar.setEnabled(true);
        }
        else{
            btnAgregar.setEnabled(false);
        }
        
    }
    
    private void actualizarControles(){
        if(campoId.isEnabled()){
            puedeAgregar();
        }
    }
        
    private void initComponents2(){
        
        astUsuario.setVisible(false);
        astContrasena.setVisible(false);
        astNuevaContrasena.setVisible(false);
        astRol.setVisible(false);
        
        DocumentListener controlCambios = new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent de) {
                actualizarControles();
            }

            @Override
            public void removeUpdate(DocumentEvent de) {
                actualizarControles();
            }

            @Override
            public void changedUpdate(DocumentEvent de) {
                actualizarControles();
            }

        };
        
        campoId.getDocument().addDocumentListener(controlCambios);
        campoContrasena.getDocument().addDocumentListener(controlCambios);
        campoNuevaContrasena.getDocument().addDocumentListener(controlCambios);
        scrollUsuariosBusqueda.getViewport().setBackground(Color.WHITE);
        
        tablaUsuarios.addMouseListener(new MouseAdapter() {
                
            @Override
            public void mouseClicked(MouseEvent e) {
                if (tablaUsuarios.getRowSelectionAllowed()) {
                    elegirActualizarEliminar();
                }
            }
            });
    }
    
    private void cargarUsuarios(){
        
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[][] usuarios=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select ultimo_acceso,id,rol from usuario";
            resultado = sentencia.executeQuery(consultaSQL);
            int usuariosSize=0;
            while(resultado.next()){
                usuariosSize++;
            }
            
            if(usuariosSize!=0){
                usuarios=new Object[usuariosSize][3];
                usuariosSize=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                    usuarios[usuariosSize][0]=resultado2.getString("id");
                    usuarios[usuariosSize][2]=resultado2.getString("ultimo_acceso");
                    if(resultado2.getString("rol").equals("a")){
                        usuarios[usuariosSize][1]="administrador(a)";
                    }
                    else{
                        usuarios[usuariosSize][1]="estandar";
                    }    
                    usuariosSize++;
                }
            }
                    
        } catch (SQLException e) {
            
            JOptionPane.showMessageDialog(null, "\n Imposible cargar los usuarios \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        tablaUsuarios.setModel(new javax.swing.table.DefaultTableModel(
            usuarios,
                
            new String [] {
                "Usuario", "Rol", "Último Acceso"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });  
        
    }    
    
    
    //////////////////////////////CLASES/////////////////////////////////////////////
    
    private void mensajeAyudaPanelCursos(){
        JOptionPane.showMessageDialog(null, 
                "\n1- Para añadir un curso es necesario presionar el botón 'nuevo', luego ingresar los datos en los campos requeridos"
              + "\ny presionar el botón 'agregar' para confirmar que se añadirá el curso al sistema. Para salir del modo agregar se"
              + "\ndebe presionar en el botón cancelar."
              + "\n"
              + "\n2- Para actualizar algún curso primero se debe escoger el curso en la tabla que se encuentra al lado derecho de"
              + "\nesta sección. Una vez seleccionado, aparece una pequeña ventana para confirmar qué hacer con el curso escodigo."
              + "\nEntre las opciones se encuentran 'actualizar' y 'eliminar', por lo que se confirma que se actualizará dicho usuario."
              + "\nLuego se mostrará habilitada la opción de actualizar el curso seleccionado, mediante la opción del botón llamado"
              + "\n'actualizar', y se prosigue con actualizar los campos necesarios que se quieran modificar del curso. Por último se"
              + "\npresiona el botón 'actualizar' para confirmar los cambios en el curso seleccionado. Para salir del modo actualizar"
              + "\nse presiona el botón 'cancelar'."
              + "\n"
              + "\n3- Para buscar un curso específico, primero se procede a presionar el botón 'búsqueda', el cual mostrará dos opciones"
              + "\na escoger, si se quiere realizar la búsqueda en base al código de curso o el nombre del mismo. Escogida una opción se"
              + "\nhabilitará el espacio especificado y requerido del código o nombre del curso para buscarlo bajo ese criterio en dicho"
              + "\ncampo. Así, la tabla donde se encuentran los cursos del sistema se irán filtrando conforme la persona digite en el"
              + "\ncampo especificado el curso que desee encontrar. Para salir del modo búsqueda se presiona el botón 'cancelar'. El"
              + "\nmodo búsqueda puede entrar en el modo actualizar o eliminar dependiendo si en la búsqueda la persona eligió un curso"
              + "\nde la tabla."
              + "\n"
              + "\n4- Para eliminar algún curso primero se debe escoger el curso en la tabla que se encuentra al lado derecho de esta"
              + "\nsección. Una vez seleccionado, aparece una pequeña ventana para confirmar qué hacer con el curso escodigo. Entre las"
              + "\nopciones se encuentran 'actualizar' y 'eliminar', por lo que se confirma que se entrará en el modo eliminar. Luego se"
              + "\nmostrará habilitada la opción de eliminar el curso seleccionado, mediante la opción del botón llamado 'eliminar'. Por"
              + "\núltimo se prosigue a presionar el botón 'eliminar' y confirmar que se eliminará dicho curso. Para salir del modo"
              + "\neliminar se presiona el botón 'cancelar'"
              + "\n"
              + "\n5- Para salir de algún estado de edición basta con presionar el botón 'cancelar'.", "¿Qué hacer?", JOptionPane.INFORMATION_MESSAGE);
    }
    
    private boolean minLargoCurso(){
        if(campoCurso.getText().length()>3){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean maxLargoCurso(){
        if(campoCurso.getText().length()<60){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean maxLargoCodigoCurso(){
        if(campoCodigoCurso.getText().length()<5){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean filtrosCurso(){
        int filtro1,filtro2;
        filtro1=filtro2=0;
        if(!maxLargoCodigoCurso()){
            filtro1=1;
        }
        if(!minLargoCurso()||!maxLargoCurso()){
            filtro2=1;
        }
        return filtroAvisosCurso(filtro1,filtro2);
    }
    
    private boolean filtroAvisosCurso(int filtro1, int filtro2){
        if(filtro1==0 && filtro2==0){
            subrayadoErrorCurso(0,0);
            return true;
        }
        else{
            if(filtro1==0 && filtro2==1){
                avisoLargoCurso1();
                return false;
            }
            else{
                if(filtro1==1 && filtro2==0){
                    avisoLargoCurso2();
                    return false;
                }
                else{
                    if(filtro1==1 && filtro2==1){
                        avisoLargoCurso3();
                        return false;
                    }
                }
            }
        }
        return false;
    }
    
    private void avisoLargoCurso1(){ //0-1
        subrayadoErrorCurso(0,1);
        JOptionPane.showMessageDialog(null, "\nEl nombre del curso no puede tener más de 59 y no menos de 4 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargoCurso2(){ //1-0
        subrayadoErrorCurso(1,0);
        JOptionPane.showMessageDialog(null, "\nEl código del curso no puede tener más de 4 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargoCurso3(){ //1-1
        subrayadoErrorCurso(1,1);
        JOptionPane.showMessageDialog(null, "\nEl código del curso no puede tener más de 4 caracteres\nEl nombre del curso no puede tener más de 59 y no menos de 4 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void subrayadoErrorCurso(int filtro1, int filtro2){
        if(filtro1==1){
            campoCodigoCurso.setBackground(new Color(255,51,51));
            campoCodigoCurso.setToolTipText("Revisar código del curso");
        }
        if(filtro2==1){
            campoCurso.setBackground(new Color(255,51,51));
            campoCurso.setToolTipText("Revisar nombre del curso");
        }
        if(filtro1==0){
            if(btnAgregarCurso.isEnabled()){
                campoCodigoCurso.setBackground(Color.white);
            }
            else{
                if(btnActualizarCurso.isEnabled()){
                    campoCodigoCurso.setBackground(new Color(240,240,240));
                }
            }
            campoCodigoCurso.setToolTipText(null);
        }
        if(filtro2==0){
            campoCurso.setBackground(Color.white);
            campoCurso.setToolTipText(null);
        }
    }
    
    private void metodoBusquedaCurso(){
        if(btnBusquedaCurso.isEnabled()){
            int elegir = JOptionPane.showOptionDialog(
                null,"Elija qué método usar para buscar un curso", "Acción requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Por código", "Por nombre"},   // null para YES, NO y CANCEL
                null);
        
            if(elegir==0){
                buscarCurso(0);
            }
            else{
                if(elegir==1){
                    buscarCurso(1);
                }
            }
        }
    }
    
    private void codigoCursoSorter(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaCursos.getModel());
        tablaCursos.setRowSorter(sorter);
        if(campoCodigoCurso.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoCodigoCurso.getText(),0));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
    private void nombreCursoSorter(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaCursos.getModel());
        tablaCursos.setRowSorter(sorter);
        if(campoCurso.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoCurso.getText(),1));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
    private void nuevoCurso(){
        if(btnNuevoCurso.isEnabled()){
            edicionCurso.setText("Edición: agregar");
            astCodigoCurso.setVisible(true);
            campoCodigoCurso.setBackground(Color.white);
            campoCodigoCurso.setEnabled(true);
            campoCodigoCurso.requestFocus();
            astCurso.setVisible(true);
            campoCurso.setBackground(Color.white);
            campoCurso.setEnabled(true);
            astEstadoCurso.setVisible(true);
            estadoActivo.setEnabled(true);
            estadoDesactivo.setEnabled(true);
            btnNuevoCurso.setEnabled(false);
            btnBusquedaCurso.setEnabled(false);
            btnEliminarCurso.setEnabled(false);
            btnCancelarCurso.setEnabled(true);
            tablaCursos.clearSelection();
            tablaCursos.setRowSelectionAllowed(false);
            unoNadaMas=false;
        }
    }
    
    private void puedeAgregarCurso(){
        if(btnAgregarCurso.isEnabled()){
            if(filtrosCurso()){
                agregarCurso();
            }
        }
    }
    
    private void agregarCurso(){
        
            int confirmado = JOptionPane.showOptionDialog(
                null,"Curso: "+campoCodigoCurso.getText().replaceAll("\\s+","")+"-"+campoCurso.getText().replaceAll("\\s+","")+"\n \nConfirmar creación de curso", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
                    String consultaSQL="";
                    if(estadoActivo.isSelected()){
                        consultaSQL = "insert into curso (codigo,nombre,activo) VALUES ("+Integer.parseInt(campoCodigoCurso.getText())+",'"+campoCurso.getText()+"','true')";
                    
                    }
                    else{
                        if(estadoDesactivo.isSelected()){
                            consultaSQL = "insert into curso (codigo,nombre,activo) VALUES ("+Integer.parseInt(campoCodigoCurso.getText())+",'"+campoCurso.getText()+"','false')";
                        }
                    }
                    resultado = sentencia.executeQuery(consultaSQL);

                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        if(estadoActivo.isSelected()){
                            ((DefaultTableModel)tablaCursos.getModel()).addRow(new Object[]{Integer.parseInt(campoCodigoCurso.getText()), campoCurso.getText(), "Activo"});
                        }
                        else{
                            ((DefaultTableModel)tablaCursos.getModel()).addRow(new Object[]{Integer.parseInt(campoCodigoCurso.getText()), campoCurso.getText(), "Desactivo"});
                        }
                        JOptionPane.showMessageDialog(null,"\n ¡Curso: "+campoCurso.getText()+"-"+campoCodigoCurso.getText()+" añadido al sistema!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                        añadidoCurso();
                    }
                    else{       
                        if(e.getSQLState().equals("23505")){ //unique violation: llave duplicada
                            JOptionPane.showMessageDialog(null, "\n Imposible añadir curso \n Un curso con dicho código ya ha sido registrado, por favor asegúrese de ingresar correctamete los datos", "Error", JOptionPane.ERROR_MESSAGE); 
                        }
                        else{
                            JOptionPane.showMessageDialog(null, "\n Imposible añadir curso \n Por favor ingresar los datos correctamente", "Error", JOptionPane.ERROR_MESSAGE);
                            e.printStackTrace();
                            conexion = null;
                        }
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    
    private void actualizarCurso(){
        edicionCurso.setText("Edición: actualizar");
        btnNuevoCurso.setEnabled(false);
        btnActualizarCurso.setEnabled(true);
        btnBusquedaCurso.setEnabled(false);
        btnEliminarCurso.setEnabled(false);
        btnCancelarCurso.setEnabled(true);
        astCodigoCurso.setVisible(false);
        campoCodigoCurso.setBackground(new Color(240,240,240));
        campoCodigoCurso.setEnabled(false);
        if(!(tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 0)+"").equals(campoCodigoCurso.getText().replaceAll("\\s+",""))){
            campoCurso.setText("");
        }
        campoCodigoCurso.setText(tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 0)+"");
        astCurso.setVisible(false);
        campoCurso.setToolTipText(null);
        campoCurso.setText(((String)tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 1)).replaceAll("\\s+",""));
        campoCurso.setEnabled(true);
        campoCurso.setBackground(Color.white);
        campoCurso.setEditable(true);
        campoCurso.requestFocus();
        estadoActivo.setEnabled(true);
        estadoDesactivo.setEnabled(true);
        if(((String)tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 2)).replaceAll("\\s+","").equals("Activo")){
            estadoActivo.setSelected(true);
            estadoDesactivo.setSelected(false);
        }
        else{
            estadoActivo.setSelected(false);
            estadoDesactivo.setSelected(true);
        }
    }
    
    private void puedeActualizarCurso(){
        if(btnActualizarCurso.isEnabled()){
            if(filtrosCurso()){
                actualizarRegistrosCurso();
            }
        }
    }
    
    private void actualizadoCurso(){
        campoCodigoCurso.setBackground(new Color(240,240,240));
        campoCurso.requestFocus();
    }

    private void elegirActualizarEliminarCurso(){
        int elegir = JOptionPane.showOptionDialog(
            null,"Elija qué desea realizar con el curso: "+(tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 0))+"-"+((String)tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 1)).replaceAll("\\s+",""), "Acción requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
            null,    // null para icono por defecto.
            new Object[] { "Actualizar", "Eliminar"},   // null para YES, NO y CANCEL
            null);
        
        if(elegir==0){//habilitar actualizar curso
            actualizarCurso();
        }
        else{//habilitar eliminar curso
            if(elegir==1){
                eliminarCurso();
            }
        }   
    }
    
    private void actualizarRegistrosCurso(){
        int confirmado = JOptionPane.showOptionDialog(
            null,"Confirmar actualización del curso: "+campoCodigoCurso.getText().replaceAll("\\s+","")+"\n \nConfirmación requerida", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
            null,    // null para icono por defecto.
            new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
            null);
                
        if(confirmado==0){
            Connection conexion=null;
            Statement sentencia=null;
            ResultSet resultado=null;
        
            try {
                Class.forName("org.postgresql.Driver");
            }catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            try{
                conexion = DriverManager.getConnection(cadenaConexion);
                sentencia = conexion.createStatement();
                String consultaSQL;
                
                if(estadoActivo.isSelected()){
                    if(campoCurso.getText().replaceAll("\\s+","").equals("")){
                        consultaSQL="update curso set activo='true' where codigo="+campoCodigoCurso.getText();
                    }
                    else{
                        consultaSQL="update curso set nombre='"+campoCurso.getText().replaceAll("\\s+","")+"',activo='true' where codigo="+campoCodigoCurso.getText();
                    }
                }
                else{
                    if(campoCurso.getText().replaceAll("\\s+","").equals("")){
                        consultaSQL="update curso set activo='false' where codigo="+campoCodigoCurso.getText();
                    }
                    else{
                        consultaSQL="update curso set nombre='"+campoCurso.getText().replaceAll("\\s+","")+"',activo='false' where codigo="+campoCodigoCurso.getText();
                    }
                }
                resultado = sentencia.executeQuery(consultaSQL);

            } catch (SQLException e) {
                if(e.getSQLState().equals("02000")){ //no_data , una actualización no devuelve nada
                    tablaCursos.setValueAt(campoCurso.getText().replaceAll("\\s+",""), tablaCursos.getSelectedRow(), 1);
                    if(estadoActivo.isSelected()){
                        tablaCursos.setValueAt("Activo", tablaCursos.getSelectedRow(), 2);
                    }
                    else{
                        tablaCursos.setValueAt("Desactivo", tablaCursos.getSelectedRow(), 2);
                    }
                    actualizadoCurso();
                    JOptionPane.showMessageDialog(null,"\n ¡Curso "+campoCodigoCurso.getText().replaceAll("\\s+","")+" actualizado!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                }
                else{       
                    JOptionPane.showMessageDialog(null, "\n Imposible actualizar curso \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                    conexion = null;
                }
            }
            finally {
                if (resultado != null) {
                    try {
                        resultado.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if (sentencia != null) {
                    try {
                        sentencia.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if (conexion != null) {
                    try {
                        conexion.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    private void puedeEliminarCurso(){
        if(btnEliminarCurso.isEnabled()){
            if(tablaCursos.getSelectedColumn()!=-1){
                eliminarRegistrosCurso();
            }
            else{
                JOptionPane.showMessageDialog(null, "\nNingún curso qué seleccionar para eliminar, por favor de click en el botón 'cancelar'", "Error", JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }
    
    private void eliminarRegistrosCurso(){
        
            int confirmado = JOptionPane.showOptionDialog(
                null,"Curso: "+tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 0)+"-"+((String)tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 1)).replaceAll("\\s+","")+"\n \nConfirmar eliminación de curso", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
                    String consultaSQL = "delete from curso where codigo="+tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 0);
                    resultado = sentencia.executeQuery(consultaSQL);
                         
                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        int codigo = (int)tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 0);
                        String curso = new String(((String)tablaCursos.getValueAt(tablaCursos.getSelectedRow(), 1)).replaceAll("\\s+",""));
                        ((DefaultTableModel)tablaCursos.getModel()).removeRow(tablaCursos.convertRowIndexToModel(tablaCursos.getSelectedRow()));
                        JOptionPane.showMessageDialog(null,"\n ¡Curso "+codigo+"-"+curso+" eliminado del sistema!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                        eliminadoCurso();
                    }
                    else{       
                        JOptionPane.showMessageDialog(null, "\n Imposible eliminar curso del sistema\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                        e.printStackTrace();
                        conexion = null;
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
    
    private void añadidoCurso(){
        campoCurso.setText("");
        campoCodigoCurso.setText("");
        estadoActivo.setSelected(false);
        estadoDesactivo.setSelected(false);
        tablaCursos.clearSelection();
    }
    
    private void eliminadoCurso(){
        tablaCursos.clearSelection();
    }
     
    private void cancelarCurso(){
        if(btnCancelarCurso.isEnabled()){
            btnNuevoCurso.setEnabled(true);
            btnAgregarCurso.setEnabled(false);
            btnActualizarCurso.setEnabled(false);
            btnBusquedaCurso.setEnabled(true);
            btnEliminarCurso.setEnabled(false);
            astCodigoCurso.setVisible(false);
            campoCodigoCurso.setToolTipText(null);
            campoCodigoCurso.setBackground(new Color(240,240,240));
            campoCodigoCurso.setEnabled(false);
            campoCodigoCurso.setText("");
            astCurso.setVisible(false);
            campoCurso.setToolTipText(null);
            campoCurso.setBackground(new Color(240,240,240));
            campoCurso.setEnabled(false);
            campoCurso.setText("");
            astEstadoCurso.setVisible(false);
            estadoActivo.setSelected(false);
            estadoActivo.setEnabled(false);
            estadoDesactivo.setSelected(false);
            estadoDesactivo.setEnabled(false);
            btnCancelarCurso.setEnabled(false);
            tablaCursos.clearSelection();
            tablaCursos.setRowSelectionAllowed(true);
            edicionCurso.setText("Edición: esperando...");
            codigoCursoSorter();
            unoNadaMas=false;
        }
    }
    
    private void buscarCurso(int metodo){
        edicionCurso.setText("Edición: búsqueda");
        btnNuevoCurso.setEnabled(false);
        btnCancelarCurso.setEnabled(true);
        btnBusquedaCurso.setEnabled(false);
        if(metodo==0){
            astCodigoCurso.setVisible(true);
            campoCodigoCurso.setBackground(Color.white);
            campoCodigoCurso.setEnabled(true);
            campoCodigoCurso.requestFocus();
        }
        else{
            if(metodo==1){
                astCurso.setVisible(true);
                campoCurso.setBackground(Color.white);
                campoCurso.setEnabled(true);
                campoCurso.requestFocus();
            }
        }
        tablaCursos.clearSelection();
        unoNadaMas=true;
    }
    
    private void eliminarCurso(){
        edicionCurso.setText("Edición: eliminar");
        btnNuevoCurso.setEnabled(false);
        btnActualizarCurso.setEnabled(false);
        btnBusquedaCurso.setEnabled(false);
        btnEliminarCurso.setEnabled(true);
        btnCancelarCurso.setEnabled(true);
        astCodigoCurso.setVisible(false);
        campoCodigoCurso.setBackground(new Color(240,240,240));
        campoCodigoCurso.setEnabled(false);
        campoCodigoCurso.setText("");
        astCurso.setVisible(false);
        campoCurso.setToolTipText(null);
        campoCurso.setBackground(new Color(240,240,240));
        campoCurso.setEnabled(false);
        campoCurso.setText("");
        estadoActivo.setSelected(false);
        estadoActivo.setEnabled(false);
        estadoDesactivo.setSelected(false);
        estadoDesactivo.setEnabled(false);
    }
    
    private void puedeAgregarCurso2(){
        if(!campoCurso.getText().equals("") && !campoCodigoCurso.getText().equals("") && (estadoActivo.isSelected()||estadoDesactivo.isSelected())){
            btnAgregarCurso.setEnabled(true);
        }
        else{
            btnAgregarCurso.setEnabled(false);
        }
        
    }
    
    
    private void actualizarControlesCursos(){
        if(campoCodigoCurso.isEnabled()){
            puedeAgregarCurso2();
        }
    }
    
    
    private void initComponents3(){
        astCodigoCurso.setVisible(false);
        astCurso.setVisible(false);
        astEstadoCurso.setVisible(false);
        
        DocumentListener controlCambios = new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent de) {
                actualizarControlesCursos();
            }

            @Override
            public void removeUpdate(DocumentEvent de) {
                actualizarControlesCursos();
            }

            @Override
            public void changedUpdate(DocumentEvent de) {
                actualizarControlesCursos();
            }
 
        };
        campoCurso.getDocument().addDocumentListener(controlCambios);
        campoCodigoCurso.getDocument().addDocumentListener(controlCambios);
        scrollCursosBusqueda.getViewport().setBackground(Color.WHITE);
        
        tablaCursos.addMouseListener(new MouseAdapter() {
                
            @Override
            public void mouseClicked(MouseEvent e) {
                if (tablaCursos.getRowSelectionAllowed()) {
                        elegirActualizarEliminarCurso();
                    }
                }
            });
        
        tablaCursos.getColumnModel().getColumn(0).setMaxWidth(45);
        tablaCursos.getColumnModel().getColumn(0).setMinWidth(45);
        tablaCursos.getColumnModel().getColumn(2).setMaxWidth(65);
        tablaCursos.getColumnModel().getColumn(2).setMinWidth(65);
    }
    
    private void cargarCursos(){
        
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[][] cursos=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select codigo,nombre,activo from curso";
            resultado = sentencia.executeQuery(consultaSQL);
            int cursosSize=0;
            while(resultado.next()){
                cursosSize++;
            }
            
            if(cursosSize!=0){
                cursos=new Object[cursosSize][3];
                cursosSize=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                    cursos[cursosSize][0]=resultado2.getInt("codigo");
                    cursos[cursosSize][1]=resultado2.getString("nombre").replaceAll("\\s+","");
                    if(resultado2.getBoolean("activo")){
                        cursos[cursosSize][2]="Activo";    
                    }
                    else{
                        cursos[cursosSize][2]="Desactivo"; 
                    }
                    cursosSize++;
                }
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "\n Imposible cargar los cursos \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        tablaCursos.setModel(new javax.swing.table.DefaultTableModel(
            cursos,
                
            new String [] {
                "Código", "Curso", "Estado"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });  
        
       tablaCursos.getColumnModel().getColumn(0).setMaxWidth(45);
       tablaCursos.getColumnModel().getColumn(0).setMinWidth(45);
       tablaCursos.getColumnModel().getColumn(2).setMaxWidth(65);
       tablaCursos.getColumnModel().getColumn(2).setMinWidth(65);
        
    }    
    
    //////////////////////////////MONTOS////////////////////////////
    
    private void mensajeAyudaPanelMontos(){
        JOptionPane.showMessageDialog(null, 
                "\n1- Para actualizar alguno de los cuatro montos con los que se trabaja, primero se debe seleccionar de la"
              + "\ntabla de montos ubicada en el centro el Concepto del cual modificar su monto. Luego se habilita abajo el"
              + "\nespacio correspondiente para editar el monto para luego actualizarlo al presionar el botón 'actualizar"
              + "\nmonto' y confirmar la acción." 
              + "\n"
              + "\n2- Por defecto todos los campos regresan a su estado original, a como se encontraron, al salir de dicha"
              + "\nsección.", "¿Qué hacer?", JOptionPane.INFORMATION_MESSAGE);
    }
    
    private void cargarMontos(){
        
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[][] montos=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select codigo,concepto,monto from monto";
            resultado = sentencia.executeQuery(consultaSQL);
            int montosSize=0;
            while(resultado.next()){
                montosSize++;
            }
            
            if(montosSize!=0){
                montos=new Object[montosSize][3];
                montosSize=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                    montos[montosSize][0]=resultado2.getInt("codigo");
                    montos[montosSize][1]=resultado2.getString("concepto").replaceAll("\\s+","");
                    montos[montosSize][2]=resultado2.getString("monto").replaceAll("\\s+","");
                    montosSize++;
                }
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "\n Imposible cargar los montos \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        tablaMontos.setModel(new javax.swing.table.DefaultTableModel(
            montos,
                
            new String [] {
                "Código", "Concepto", "Monto"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });  
        
    }
    
    private void puedeActualizarMontos(){
        if(btnActualizarMonto.isEnabled()){
            actualizarMontos();
        }
    }
    
    private void actualizarCampoMonto(){
        String montoConcepto=((String)tablaMontos.getValueAt(tablaMontos.getSelectedRow(), 2));
        montoConcepto=montoConcepto.substring(0, montoConcepto.length() - 2);
        montoConcepto=montoConcepto.replace(".","");
        montoConcepto=montoConcepto.replace(",","");
        montoConcepto=montoConcepto.replace("¢","");
        montoConcepto=montoConcepto.replace("C","");
        campoActualizarMonto.setText(montoConcepto);
    }
        
    private void actualizarMontos(){
        NumberFormat fmt = NumberFormat.getCurrencyInstance();
        int confirmado = JOptionPane.showOptionDialog(
                null,"Nuevo monto: "+fmt.format(Integer.parseInt((String)campoActualizarMonto.getText()))+"\n \nConfirmar actualización del monto de "+((String)tablaMontos.getValueAt(tablaMontos.getSelectedRow(), 1)).replaceAll("\\s+",""), "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
            
                    String consultaSQL = "update monto set monto="+Integer.parseInt(campoActualizarMonto.getText()) +" where codigo="+tablaMontos.getValueAt(tablaMontos.getSelectedRow(), 0);
                    resultado = sentencia.executeQuery(consultaSQL);

                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        tablaMontos.setValueAt(fmt.format((Integer.parseInt((String)campoActualizarMonto.getText()))),tablaMontos.getSelectedRow(),2);
                        JOptionPane.showMessageDialog(null,"\n ¡Monto de "+Integer.parseInt(campoActualizarMonto.getText())+" actualizado!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                    }
                    else{       
                        JOptionPane.showMessageDialog(null, "\n Imposible actualizar monto \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                        e.printStackTrace();
                        conexion = null;
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
    
    private void puedeActualizarMonto(){
        actualizarCampoMonto();
        campoActualizarMonto.setEnabled(true);
        campoActualizarMonto.requestFocus();
    }
    
    private void puedeActualizarMonto2(){
        if(!campoActualizarMonto.getText().equals("")){
            btnActualizarMonto.setEnabled(true);
        }
        else{
            btnActualizarMonto.setEnabled(false);
        }
    }
    
    private void salirSeccionMontos(){
        tablaMontos.clearSelection();
        campoActualizarMonto.setText(null);
        campoActualizarMonto.setEnabled(false);
    }
     
    private void initComponents4(){   
        
        DocumentListener controlCambios = new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent de) {
                puedeActualizarMonto2();
            }

            @Override
            public void removeUpdate(DocumentEvent de) {
                puedeActualizarMonto2();
            }

            @Override
            public void changedUpdate(DocumentEvent de) {
                puedeActualizarMonto2();
            }

        };
        campoActualizarMonto.getDocument().addDocumentListener(controlCambios);
        
        tablaMontos.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                puedeActualizarMonto();
            }
        });
    }
    
    ///////////////////////////////PROMOCIONES/////////////////////////////////////
    
    private void mensajeAyudaPanelPromociones(){
        JOptionPane.showMessageDialog(null, 
                "\n1- Para añadir una promoción es necesario presionar el botón 'nuevo', luego ingresar los datos en los campos requeridos"
              + "\ny presionar el botón 'agregar' para confirmar que se añadirá la promoción al sistema. Para salir del modo agregar se"
              + "\ndebe presionar en el botón cancelar."
              + "\n"
              + "\n2- Para actualizar alguna promoción primero se debe escoger la promoción en la tabla que se encuentra al lado derecho de"
              + "\nesta sección. Una vez seleccionada, aparece una pequeña ventana para confirmar qué hacer con la promoción escodiga."
              + "\nEntre las opciones se encuentran 'actualizar' y 'eliminar', por lo que se confirma que se actualizará dicha promoción."
              + "\nLuego se mostrará habilitada la opción de actualizar la promoción seleccionada, mediante la opción del botón llamado"
              + "\n'actualizar', y se prosigue con actualizar los campos necesarios que se quieran modificar de la promoción. Por último se"
              + "\npresiona el botón 'actualizar' para confirmar los cambios en la promoción seleccionada. Para salir del modo actualizar"
              + "\nse presiona el botón 'cancelar'."
              + "\n"
              + "\n3- Para buscar una promoción específica, primero se procede a presionar el botón 'búsqueda', el cual mostrará dos opciones"
              + "\na escoger, si se quiere realizar la búsqueda en base al código de promoción o el nombre de la misma. Escogida una opción se"
              + "\nhabilitará el espacio especificado y requerido del código o nombre de la promoción para buscarlo bajo ese criterio en dicho"
              + "\ncampo. Así, la tabla donde se encuentran las promociones del sistema se irán filtrando conforme la persona digite en el"
              + "\ncampo especificado la promoción que desee encontrar. Para salir del modo búsqueda se presiona el botón 'cancelar'. El"
              + "\nmodo búsqueda puede entrar en el modo actualizar o eliminar dependiendo si en la búsqueda la persona eligió una promoción"
              + "\nde la tabla."
              + "\n"
              + "\n4- Para eliminar alguna promoción primero se debe escoger la promoción en la tabla que se encuentra al lado derecho de esta"
              + "\nsección. Una vez seleccionada, aparece una pequeña ventana para confirmar qué hacer con la promoción escodiga. Entre las"
              + "\nopciones se encuentran 'actualizar' y 'eliminar', por lo que se confirma que se entrará en el modo eliminar. Luego se"
              + "\nmostrará habilitada la opción de eliminar la promoción seleccionada, mediante la opción del botón llamado 'eliminar'. Por"
              + "\núltimo se prosigue a presionar el botón 'eliminar' y confirmar que se eliminará dicha promoción. Para salir del modo"
              + "\neliminar se presiona el botón 'cancelar'"
              + "\n"
              + "\n5- Para salir de algún estado de edición basta con presionar el botón 'cancelar'.", "¿Qué hacer?", JOptionPane.INFORMATION_MESSAGE);
    }
    
    private boolean minLargoPromocion(){
        if(campoPromocion.getText().length()>3){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean maxLargoPromocion(){
        if(campoPromocion.getText().length()<52){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean maxLargoCodigoPromocion(){
        if(campoCodigoPromocion.getText().length()<5){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean maxLargoMontoPromocion(){
        if(campoMontoPromocion.getText().length()<10){
            return true;
        }
        else{
            return false;
        }
    }
    
    private boolean filtrosPromocion(){
        int filtro1,filtro2,filtro3;
        filtro1=filtro2=filtro3=0;
        if(!maxLargoCodigoPromocion()){
            filtro1=1;
        }
        if(!minLargoPromocion()||!maxLargoPromocion()){
            filtro2=1;
        }
        if(!maxLargoMontoPromocion()){
            filtro3=1;
        }
        return filtroAvisosPromocion(filtro1,filtro2,filtro3);
    }
    
    private boolean filtroAvisosPromocion(int filtro1, int filtro2, int filtro3){
        if(filtro1==0){
            if(filtro2==0){
                if(filtro3==0){
                    subrayadoErrorPromocion(0,0,0);
                    return true;
                }
                else{
                    avisoLargoPromocion1();
                    return false;
                }
            }
            else{
                if(filtro3==0){
                    avisoLargoPromocion2();
                    return false;
                }
                else{
                    avisoLargoPromocion3();
                    return false;
                }
            }
        }
        else{
            if(filtro2==0){
                if(filtro3==0){
                    avisoLargoPromocion4();
                    return false;
                }
                else{
                    avisoLargoPromocion5();
                    return false;
                }
            }
            else{
                if(filtro3==0){
                    avisoLargoPromocion6();
                    return false;
                }
                else{
                    avisoLargoPromocion7();
                    return false;
                }
            }
        }
    }
    
    private void avisoLargoPromocion1(){ //0-0-1
        subrayadoErrorPromocion(0,0,1);
        JOptionPane.showMessageDialog(null, "\nEl monto de la promoción no puede superar la cifra de 9 dígitos", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargoPromocion2(){ //0-1-0
        subrayadoErrorPromocion(0,1,0);
        JOptionPane.showMessageDialog(null, "\nEl nombre de la promoción no puede tener más de 51 y no menos de 4 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargoPromocion3(){ //0-1-1
        subrayadoErrorPromocion(0,1,1);
        JOptionPane.showMessageDialog(null, "\nEl nombre de la promoción no puede tener más de 51 y no menos de 4 caracteres\nEl monto de la promoción no puede superar la cifra de 9 dígitos", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargoPromocion4(){ //1-0-0
        subrayadoErrorPromocion(1,0,0);
        JOptionPane.showMessageDialog(null, "\nEl código de la promoción no puede tener más de 4 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargoPromocion5(){ //1-0-1
        subrayadoErrorPromocion(1,0,1);
        JOptionPane.showMessageDialog(null, "\nEl código de la promoción no puede tener más de 4 caracteres\nEl monto de la promoción no puede superar la cifra de 9 dígitos", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargoPromocion6(){ //1-1-0
        subrayadoErrorPromocion(1,1,0);
        JOptionPane.showMessageDialog(null, "\nEl código de la promoción no puede tener más de 4 caracteres\nEl nombre de la promoción no puede tener más de 51 y no menos de 4 caracteres", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void avisoLargoPromocion7(){ //1-1-1
        subrayadoErrorPromocion(1,1,1);
        JOptionPane.showMessageDialog(null, "\nEl código de la promoción no puede tener más de 4 caracteres\nEl nombre de la promoción no puede tener más de 51 y no menos de 4 caracteres\nEl monto de la promoción no puede superar la cifra de 9 dígitos", "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    private void subrayadoErrorPromocion(int filtro1, int filtro2, int filtro3){
        if(filtro1==1){
            campoCodigoPromocion.setBackground(new Color(255,51,51));
            campoCodigoPromocion.setToolTipText("Revisar código de la promoción");
        }
        if(filtro2==1){
            campoPromocion.setBackground(new Color(255,51,51));
            campoPromocion.setToolTipText("Revisar nombre de la promoción");
        }
        if(filtro3==1){
            campoMontoPromocion.setBackground(new Color(255,51,51));
            campoMontoPromocion.setToolTipText("Revisar monto de la promoción");
        }
        if(filtro1==0){
            if(btnAgregarPromocion.isEnabled()){
                campoCodigoPromocion.setBackground(Color.white);
            }
            else{
                if(btnActualizarPromocion.isEnabled()){
                    campoCodigoPromocion.setBackground(new Color(240,240,240));
                }
            }
            campoCodigoPromocion.setToolTipText(null);
        }
        if(filtro2==0){
            campoPromocion.setBackground(Color.white);
            campoPromocion.setToolTipText(null);
        }
        if(filtro3==0){
            campoMontoPromocion.setBackground(Color.white);
            campoMontoPromocion.setToolTipText(null);
        }
    }
    
    private void metodoBusquedaPromocion(){
        if(btnBusquedaPromocion.isEnabled()){
            int elegir = JOptionPane.showOptionDialog(
                null,"Elija qué método usar para buscar una promoción", "Acción requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Por código", "Por nombre"},   // null para YES, NO y CANCEL
                null);
        
            if(elegir==0){
                buscarPromocion(0);
            }
            else{
                if(elegir==1){
                    buscarPromocion(1);
                }
            }
        }
    }
    
    private void codigoPromocionSorter(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaPromociones.getModel());
        tablaPromociones.setRowSorter(sorter);
        if(campoCodigoPromocion.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoCodigoPromocion.getText(),0));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
    private void nombrePromocionSorter(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaPromociones.getModel());
        tablaPromociones.setRowSorter(sorter);
        if(campoPromocion.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoPromocion.getText(),1));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
    private void nuevoPromocion(){
        if(btnNuevoPromocion.isEnabled()){
            edicionPromocion.setText("Edición: agregar");
            astCodigoPromocion.setVisible(true);
            campoCodigoPromocion.setBackground(Color.white);
            campoCodigoPromocion.setEnabled(true);
            campoCodigoPromocion.requestFocus();
            astPromocion.setVisible(true);
            campoPromocion.setBackground(Color.white);
            campoPromocion.setEnabled(true);
            astTipoMonto.setVisible(true);
            checkDigitado.setEnabled(true);
            checkTotal.setEnabled(true);
            astEstadoPromocion.setVisible(true);
            estadoActivoPromocion.setEnabled(true);
            estadoDesactivoPromocion.setEnabled(true);
            btnNuevoPromocion.setEnabled(false);
            btnBusquedaPromocion.setEnabled(false);
            btnEliminarPromocion.setEnabled(false);
            btnCancelarPromocion.setEnabled(true);
            tablaPromociones.clearSelection();
            tablaPromociones.setRowSelectionAllowed(false);
            unoNadaMas=false;
        }
    }
    
    private void puedeAgregarPromocion(){
        if(btnAgregarPromocion.isEnabled()){
            if(filtrosPromocion()){
                agregarPromocion();
            }
        }
    }
    
    private void agregarPromocion(){
        NumberFormat fmt = NumberFormat.getCurrencyInstance();
            int confirmado = JOptionPane.showOptionDialog(
                null,"Promoción: "+campoCodigoPromocion.getText().replaceAll("\\s+","")+"-"+campoPromocion.getText().replaceAll("\\s+","")+"\n \nConfirmar creación de promoción", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
                    String consultaSQL="";
                    if(checkTotal.isSelected()){
                        if(estadoActivoPromocion.isSelected()){
                            consultaSQL = "insert into promocion (codigo,nombre,monto,activo) VALUES ("+Integer.parseInt(campoCodigoPromocion.getText())+",'"+campoPromocion.getText()+"',"+0+",'true')";
                        }
                        else{
                            if(estadoDesactivoPromocion.isSelected()){
                                consultaSQL = "insert into promocion (codigo,nombre,monto,activo) VALUES ("+Integer.parseInt(campoCodigoPromocion.getText())+",'"+campoPromocion.getText()+"',"+0+",'false')";
                            }
                        }
                    }
                    else{
                        if(estadoActivoPromocion.isSelected()){
                            consultaSQL = "insert into promocion (codigo,nombre,monto,activo) VALUES ("+Integer.parseInt(campoCodigoPromocion.getText())+",'"+campoPromocion.getText()+"',"+Integer.parseInt(campoMontoPromocion.getText())+",'true')";
                        }
                        else{
                            if(estadoDesactivoPromocion.isSelected()){
                                consultaSQL = "insert into promocion (codigo,nombre,monto,activo) VALUES ("+Integer.parseInt(campoCodigoPromocion.getText())+",'"+campoPromocion.getText()+"',"+Integer.parseInt(campoMontoPromocion.getText())+",'false')";
                            }
                        }
                    }
                    resultado = sentencia.executeQuery(consultaSQL);

                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        if(checkTotal.isSelected()){
                            if(estadoActivoPromocion.isSelected()){
                                ((DefaultTableModel)tablaPromociones.getModel()).addRow(new Object[]{Integer.parseInt(campoCodigoPromocion.getText()), campoPromocion.getText(), "Sin costo", "Activo"});
                            }
                            else{
                                ((DefaultTableModel)tablaPromociones.getModel()).addRow(new Object[]{Integer.parseInt(campoCodigoPromocion.getText()), campoPromocion.getText(), "Sin costo", "Desactivo"});
                            }
                        }
                        else{
                            if(estadoActivoPromocion.isSelected()){
                                ((DefaultTableModel)tablaPromociones.getModel()).addRow(new Object[]{Integer.parseInt(campoCodigoPromocion.getText()), campoPromocion.getText(), fmt.format((Integer.parseInt((String)campoMontoPromocion.getText()))), "Activo"});
                            }
                            else{
                                ((DefaultTableModel)tablaPromociones.getModel()).addRow(new Object[]{Integer.parseInt(campoCodigoPromocion.getText()), campoPromocion.getText(), fmt.format((Integer.parseInt((String)campoMontoPromocion.getText()))), "Desactivo"});
                            }
                        }
                        JOptionPane.showMessageDialog(null,"\n ¡Promoción: "+campoCodigoPromocion.getText().replaceAll("\\s+","")+"-"+campoPromocion.getText().replaceAll("\\s+","")+" añadida al sistema!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                        añadidoPromocion();
                    }
                    else{       
                        if(e.getSQLState().equals("23505")){ //unique violation: llave duplicada
                            JOptionPane.showMessageDialog(null, "\n Imposible añadir promoción \n Una promoción con dicho código ya ha sido registrado, por favor asegúrese de ingresar correctamete los datos", "Error", JOptionPane.ERROR_MESSAGE); 
                        }
                        else{
                            JOptionPane.showMessageDialog(null, "\n Imposible añadir promoción \n Por favor ingresar los datos correctamente", "Error", JOptionPane.ERROR_MESSAGE);
                            e.printStackTrace();
                            conexion = null;
                        }
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
     
    private void actualizarCampoMontoPromocion(){
        String montoPromocion=((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 2));
        montoPromocion=montoPromocion.substring(0, montoPromocion.length() - 2);
        montoPromocion=montoPromocion.replace(".","");
        montoPromocion=montoPromocion.replace(",","");
        montoPromocion=montoPromocion.replace("¢","");
        montoPromocion=montoPromocion.replace("C","");
        campoMontoPromocion.setText(montoPromocion);
    }
    
    private void actualizarPromocion(){
        edicionPromocion.setText("Edición: actualizar");
        btnNuevoPromocion.setEnabled(false);
        btnActualizarPromocion.setEnabled(true);
        btnBusquedaPromocion.setEnabled(false);
        btnEliminarPromocion.setEnabled(false);
        btnCancelarPromocion.setEnabled(true);
        astCodigoPromocion.setVisible(false);
        campoCodigoPromocion.setBackground(new Color(240,240,240));
        campoCodigoPromocion.setEnabled(false);
        if(!(tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0)+"").equals(campoCodigoPromocion.getText().replaceAll("\\s+",""))){
            campoPromocion.setText("");
        }
        campoCodigoPromocion.setText(tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0)+"");
        astPromocion.setVisible(false);
        campoPromocion.setToolTipText(null);
        campoPromocion.setText(((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 1)).replaceAll("\\s+",""));
        campoPromocion.setEnabled(true);
        campoPromocion.setBackground(Color.white);
        campoPromocion.setEditable(true);
        campoPromocion.requestFocus();
        checkTotal.setEnabled(true);
        checkDigitado.setEnabled(true);
        if(((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 2)).replaceAll("\\s+$","").equals("Sin costo")){
            checkTotal.setSelected(true);
            monto.setVisible(false);
            astMontoPromocion.setVisible(false);
            campoMontoPromocion.setText("");
            campoMontoPromocion.setVisible(false);
        }
        else{
            checkDigitado.setSelected(true);
            monto.setVisible(true);
            astMontoPromocion.setVisible(true);
            actualizarCampoMontoPromocion();
            campoMontoPromocion.setVisible(true);
        }
        campoMontoPromocion.setToolTipText(null);
        campoMontoPromocion.setEnabled(true);
        campoMontoPromocion.setBackground(Color.white);
        campoMontoPromocion.setEditable(true);
        estadoActivoPromocion.setEnabled(true);
        estadoDesactivoPromocion.setEnabled(true);
        if(((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 3)).replaceAll("\\s+","").equals("Activo")){
            estadoActivoPromocion.setSelected(true);
            estadoDesactivoPromocion.setSelected(false);
        }
        else{
            estadoActivoPromocion.setSelected(false);
            estadoDesactivoPromocion.setSelected(true);
        }
    }
    
    private void puedeActualizarPromocion(){
        if(btnActualizarPromocion.isEnabled()){
            if(filtrosPromocion()){
                actualizarRegistrosPromocion();
            }
        }
    }
    
    private void actualizadoPromocion(){
        campoCodigoPromocion.setBackground(new Color(240,240,240));
        campoPromocion.requestFocus();
    }

    private void elegirActualizarEliminarPromocion(){
        int elegir = JOptionPane.showOptionDialog(
            null,"Elija qué desea realizar con la promoción: "+(tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0))+"-"+((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 1)).replaceAll("\\s+",""), "Acción requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
            null,    // null para icono por defecto.
            new Object[] { "Actualizar", "Eliminar"},   // null para YES, NO y CANCEL
            null);
        
        if(elegir==0){//habilitar actualizar curso
            actualizarPromocion();
        }
        else{//habilitar eliminar curso
            if(elegir==1){
                eliminarPromocion();
            }
        }   
    }
    
    private void actualizarRegistrosPromocion(){
        int confirmado = JOptionPane.showOptionDialog(
            null,"Confirmar actualización de la promoción: "+campoCodigoPromocion.getText().replaceAll("\\s+","")+"\n \nConfirmación requerida", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
            null,    // null para icono por defecto.
            new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
            null);
                
        if(confirmado==0){
            Connection conexion=null;
            Statement sentencia=null;
            ResultSet resultado=null;
        
            try {
                Class.forName("org.postgresql.Driver");
            }catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            try{
                conexion = DriverManager.getConnection(cadenaConexion);
                sentencia = conexion.createStatement();
                String consultaSQL;
                
                if(checkDigitado.isSelected()){
                    if(estadoActivoPromocion.isSelected()){
                        if(campoPromocion.getText().replaceAll("\\s+$","").equals("")){
                            if(campoMontoPromocion.getText().replaceAll("\\s+$","").equals("")){
                                consultaSQL="update promocion set activo='true' where codigo="+campoCodigoPromocion.getText();
                            }
                            else{
                                consultaSQL="update promocion set monto="+campoMontoPromocion.getText()+",activo='true' where codigo="+campoCodigoPromocion.getText();
                            }
                        }
                        else{
                            if(campoMontoPromocion.getText().replaceAll("\\s+$","").equals("")){
                                consultaSQL="update promocion set nombre='"+campoPromocion.getText()+"',activo='true' where codigo="+campoCodigoPromocion.getText();
                            }
                            else{
                                consultaSQL="update promocion set nombre='"+campoPromocion.getText()+"',monto="+campoMontoPromocion.getText()+",activo='true' where codigo="+campoCodigoPromocion.getText();
                            }
                        }
                    }
                    else{
                        if(campoPromocion.getText().replaceAll("\\s+$","").equals("")){
                            if(campoMontoPromocion.getText().replaceAll("\\s+$","").equals("")){
                                consultaSQL="update promocion set activo='false' where codigo="+campoCodigoPromocion.getText();
                            }
                            else{
                                consultaSQL="update promocion set monto="+campoMontoPromocion.getText()+",activo='false' where codigo="+campoCodigoPromocion.getText();
                            }
                        }
                        else{
                            if(campoMontoPromocion.getText().replaceAll("\\s+$","").equals("")){
                                consultaSQL="update promocion set nombre='"+campoPromocion.getText()+"',activo='false' where codigo="+campoCodigoPromocion.getText();
                            }
                            else{
                                consultaSQL="update promocion set nombre='"+campoPromocion.getText()+"',monto="+campoMontoPromocion.getText()+",activo='false' where codigo="+campoCodigoPromocion.getText();
                            }
                        }
                    }
                }
                else{
                    if(estadoActivoPromocion.isSelected()){
                        if(campoPromocion.getText().replaceAll("\\s+$","").equals("")){
                            consultaSQL="update promocion set monto="+0+",activo='true' where codigo="+campoCodigoPromocion.getText();
                        }
                        else{
                            consultaSQL="update promocion set nombre='"+campoPromocion.getText()+"',monto="+0+",activo='true' where codigo="+campoCodigoPromocion.getText();
                        }
                    }
                    else{
                        if(campoPromocion.getText().replaceAll("\\s+$","").equals("")){
                            consultaSQL="update promocion set activo='false',monto="+0+" where codigo="+campoCodigoPromocion.getText();
                        }
                        else{
                            consultaSQL="update promocion set nombre='"+campoPromocion.getText()+"',activo='false',monto="+0+" where codigo="+campoCodigoPromocion.getText();
                        }
                    }
                }
                resultado = sentencia.executeQuery(consultaSQL);

            } catch (SQLException e) {
                if(e.getSQLState().equals("02000")){ //no_data , una actualización no devuelve nada
                    tablaPromociones.setValueAt(campoPromocion.getText().replaceAll("\\s+$",""), tablaPromociones.getSelectedRow(), 1);
                    if(estadoActivoPromocion.isSelected()){
                        tablaPromociones.setValueAt("Activo", tablaPromociones.getSelectedRow(), 3);
                    }
                    else{
                        tablaPromociones.setValueAt("Desactivo", tablaPromociones.getSelectedRow(), 3);
                    }
                    if(checkTotal.isSelected()){
                        tablaPromociones.setValueAt("Sin costo", tablaPromociones.getSelectedRow(), 2);
                    }
                    else{
                        NumberFormat fmt = NumberFormat.getCurrencyInstance();
                        tablaPromociones.setValueAt(fmt.format((Integer.parseInt((String)campoMontoPromocion.getText()))),tablaPromociones.getSelectedRow(),2);
                    }
                    
                    actualizadoPromocion();
                    JOptionPane.showMessageDialog(null,"\n ¡Promocion "+campoCodigoPromocion.getText().replaceAll("\\s+$","")+" actualizada!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                }
                else{       
                    JOptionPane.showMessageDialog(null, "\n Imposible actualizar promoción \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                    conexion = null;
                }
            }
            finally {
                if (resultado != null) {
                    try {
                        resultado.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if (sentencia != null) {
                    try {
                        sentencia.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if (conexion != null) {
                    try {
                        conexion.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    private void puedeEliminarPromocion(){
        if(btnEliminarPromocion.isEnabled()){
            if(tablaPromociones.getSelectedColumn()!=-1){
                eliminarRegistrosPromocion();
            }
            else{
                JOptionPane.showMessageDialog(null, "\nNinguna promoción qué seleccionar para eliminar, por favor de click en el botón 'cancelar'", "Error", JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }
    
    private void eliminarRegistrosPromocion(){
        
            int confirmado = JOptionPane.showOptionDialog(
                null,"Promoción: "+tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0)+"-"+((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 1)).replaceAll("\\s+","")+"\n \nConfirmar eliminación de promoción", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
                    String consultaSQL = "delete from promocion where codigo="+tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0);
                    resultado = sentencia.executeQuery(consultaSQL);
                         
                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        int codigo = (int)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0);
                        String nombrePromocion = new String(((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 1)).replaceAll("\\s+",""));
                        ((DefaultTableModel)tablaPromociones.getModel()).removeRow(tablaPromociones.convertRowIndexToModel(tablaPromociones.getSelectedRow()));
                        eliminadoPromocion();
                        ///eliminar en promocion estudiantil aquellas asociadas
                        JOptionPane.showMessageDialog(null,"\n ¡Promoción "+codigo+"-"+nombrePromocion+" eliminada del sistema! \n ¡Promociones de este tipo asociadas a estudiantes serán removidas también!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                    }
                    else{       
                        JOptionPane.showMessageDialog(null, "\n Imposible eliminar promoción del sistema\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                        e.printStackTrace();
                        conexion = null;
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
    
    private void añadidoPromocion(){
        campoPromocion.setText("");
        campoCodigoPromocion.setText("");
        campoMontoPromocion.setText("");
        estadoActivoPromocion.setSelected(false);
        estadoDesactivoPromocion.setSelected(false);
        tablaPromociones.clearSelection();
    }
    
    private void eliminadoPromocion(){
        tablaPromociones.clearSelection();
    }
     
    private void cancelarPromocion(){
        if(btnCancelarPromocion.isEnabled()){
            btnNuevoPromocion.setEnabled(true);
            btnAgregarPromocion.setEnabled(false);
            btnActualizarPromocion.setEnabled(false);
            btnBusquedaPromocion.setEnabled(true);
            btnEliminarPromocion.setEnabled(false);
            astCodigoPromocion.setVisible(false);
            campoCodigoPromocion.setToolTipText(null);
            campoCodigoPromocion.setBackground(new Color(240,240,240));
            campoCodigoPromocion.setEnabled(false);
            campoCodigoPromocion.setText("");
            astPromocion.setVisible(false);
            campoPromocion.setToolTipText(null);
            campoPromocion.setBackground(new Color(240,240,240));
            campoPromocion.setEnabled(false);
            campoPromocion.setText("");
            astTipoMonto.setVisible(false);
            checkTotal.setEnabled(false);
            checkDigitado.setEnabled(false);
            grupoTipoMonto.clearSelection();
            monto.setVisible(false);
            astMontoPromocion.setVisible(false);
            campoMontoPromocion.setToolTipText(null);
            campoMontoPromocion.setBackground(new Color(240,240,240));
            campoMontoPromocion.setText("");
            campoMontoPromocion.setVisible(false);
            astEstadoPromocion.setVisible(false);
            estadoActivoPromocion.setSelected(false);
            estadoActivoPromocion.setEnabled(false);
            estadoDesactivoPromocion.setSelected(false);
            estadoDesactivoPromocion.setEnabled(false);
            btnCancelarPromocion.setEnabled(false);
            tablaPromociones.clearSelection();
            tablaPromociones.setRowSelectionAllowed(true);
            edicionPromocion.setText("Edición: esperando...");
            codigoPromocionSorter();
            unoNadaMas=false;
        }
    }
    
    private void buscarPromocion(int metodo){
        edicionPromocion.setText("Edición: búsqueda");
        btnNuevoPromocion.setEnabled(false);
        btnCancelarPromocion.setEnabled(true);
        btnBusquedaPromocion.setEnabled(false);
        if(metodo==0){
            astCodigoPromocion.setVisible(true);
            campoCodigoPromocion.setBackground(Color.white);
            campoCodigoPromocion.setEnabled(true);
            campoCodigoPromocion.requestFocus();
        }
        else{
            if(metodo==1){
                astPromocion.setVisible(true);
                campoPromocion.setBackground(Color.white);
                campoPromocion.setEnabled(true);
                campoPromocion.requestFocus();
            }
        }
        tablaPromociones.clearSelection();
        unoNadaMas=true;
    }
    
    private void eliminarPromocion(){
        edicionPromocion.setText("Edición: eliminar");
        btnNuevoPromocion.setEnabled(false);
        btnActualizarPromocion.setEnabled(false);
        btnBusquedaPromocion.setEnabled(false);
        btnEliminarPromocion.setEnabled(true);
        btnCancelarPromocion.setEnabled(true);
        astCodigoPromocion.setVisible(false);
        campoCodigoPromocion.setBackground(new Color(240,240,240));
        campoCodigoPromocion.setEnabled(false);
        campoCodigoPromocion.setText("");
        astPromocion.setVisible(false);
        campoPromocion.setToolTipText(null);
        campoPromocion.setBackground(new Color(240,240,240));
        campoPromocion.setEnabled(false);
        campoPromocion.setText("");
        astMontoPromocion.setVisible(false);
        campoMontoPromocion.setToolTipText(null);
        campoMontoPromocion.setBackground(new Color(240,240,240));
        campoMontoPromocion.setEnabled(false);
        campoMontoPromocion.setText("");
        estadoActivoPromocion.setSelected(false);
        estadoActivoPromocion.setEnabled(false);
        estadoDesactivoPromocion.setSelected(false);
        estadoDesactivoPromocion.setEnabled(false);
    }
    
    private void puedeAgregarPromocion2(){
        if((!campoCodigoPromocion.getText().equals("") && !campoPromocion.getText().equals("") && checkTotal.isSelected() && (estadoActivoPromocion.isSelected()||estadoDesactivoPromocion.isSelected())) || (!campoCodigoPromocion.getText().equals("") && !campoPromocion.getText().equals("") && checkDigitado.isSelected() && !campoMontoPromocion.getText().equals("") && (estadoActivoPromocion.isSelected()||estadoDesactivoPromocion.isSelected()))){
            btnAgregarPromocion.setEnabled(true);
        }
        else{
            btnAgregarPromocion.setEnabled(false);
        }
        
    }
    
    
    private void actualizarControlesPromociones(){
        if(campoCodigoPromocion.isEnabled()){
            puedeAgregarPromocion2();
        }
    }
    
    
    private void initComponents5(){
        astCodigoPromocion.setVisible(false);
        astPromocion.setVisible(false);
        astTipoMonto.setVisible(false);
        monto.setVisible(false);
        astMontoPromocion.setVisible(false);
        campoMontoPromocion.setVisible(false);
        astEstadoPromocion.setVisible(false);
        
        DocumentListener controlCambios = new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent de) {
                actualizarControlesPromociones();
            }

            @Override
            public void removeUpdate(DocumentEvent de) {
                actualizarControlesPromociones();
            }

            @Override
            public void changedUpdate(DocumentEvent de) {
                actualizarControlesPromociones();
            }
 
        };
        campoCodigoPromocion.getDocument().addDocumentListener(controlCambios);
        campoPromocion.getDocument().addDocumentListener(controlCambios);
        campoMontoPromocion.getDocument().addDocumentListener(controlCambios);
        
        tablaPromociones.addMouseListener(new MouseAdapter() {
                
            @Override
            public void mouseClicked(MouseEvent e) {
                if (tablaPromociones.getRowSelectionAllowed()) {
                        elegirActualizarEliminarPromocion();
                    }
                }
            });
        
        tablaPromociones.getColumnModel().getColumn(0).setMaxWidth(45);
        tablaPromociones.getColumnModel().getColumn(0).setMinWidth(45);
        tablaPromociones.getColumnModel().getColumn(2).setMaxWidth(85);
        tablaPromociones.getColumnModel().getColumn(2).setMinWidth(85);
        tablaPromociones.getColumnModel().getColumn(3).setMaxWidth(65);
        tablaPromociones.getColumnModel().getColumn(3).setMinWidth(65);
        scrollPromociones.getViewport().setBackground(Color.WHITE);
    }
    
    private void cargarPromociones(){
        
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[][] promociones=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select codigo,nombre,monto,activo from promocion";
            resultado = sentencia.executeQuery(consultaSQL);
            int promocionesSize=0;
            while(resultado.next()){
                promocionesSize++;
            }
            
            if(promocionesSize!=0){
                promociones=new Object[promocionesSize][4];
                promocionesSize=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                    promociones[promocionesSize][0]=resultado2.getInt("codigo");
                    promociones[promocionesSize][1]=resultado2.getString("nombre").replaceAll("\\s+$","");
                    if(resultado2.getString("monto").equals("¢0,00")){
                        promociones[promocionesSize][2]="Sin costo";
                    }
                    else{
                        promociones[promocionesSize][2]=resultado2.getString("monto");
                    }
                    if(resultado2.getBoolean("activo")){
                        promociones[promocionesSize][3]="Activo";   
                    }
                    else{
                        promociones[promocionesSize][3]="Desactivo"; 
                    }
                    promocionesSize++;
                }
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "\n Imposible cargar las promociones registradas\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        tablaPromociones.setModel(new javax.swing.table.DefaultTableModel(
            promociones,
                
            new String [] {
                "Código", "Promoción", "Monto", "Estado"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });  
        
        tablaPromociones.getColumnModel().getColumn(0).setMaxWidth(45);
        tablaPromociones.getColumnModel().getColumn(0).setMinWidth(45);
        tablaPromociones.getColumnModel().getColumn(2).setMaxWidth(85);
        tablaPromociones.getColumnModel().getColumn(2).setMinWidth(85);
        tablaPromociones.getColumnModel().getColumn(3).setMaxWidth(65);
        tablaPromociones.getColumnModel().getColumn(3).setMinWidth(65);
        scrollPromociones.getViewport().setBackground(Color.WHITE);
    }   
    
    
    /*
    private void modoManejoPromociones(){
        seleccionProm=false;
        seleccionEst=false;
        edicionPromocion.setText("Edición: esperando...");
        btnManejoPromociones.setEnabled(false);
        btnPromocionEstudiantil.setEnabled(true);
        btnNuevoPromocion.setEnabled(true);
        btnBusquedaPromocion.setEnabled(true);
        tablaPromociones.setVisible(true);
        tablaPromocionesEst.setVisible(false);
        tablaPromocionEstudiantil.setVisible(false);
        fechaInicioPromocion.setEnabled(false);
        try {
            fechaInicioPromocion.setDate(null);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        }
        fechaExpiracionPromocion.setEnabled(false);
        try {
            fechaExpiracionPromocion.setDate(null);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        }
        btnAsignarPromocion.setEnabled(false);
        btnCancelarPromocionEstudiantil.setEnabled(false);
        btnBusquedaPromocionEstudiantil.setEnabled(false);
        campoBusquedaPromocionEstudiantil.setText("");
        campoBusquedaPromocionEstudiantil.setEnabled(false);
        btnDesasignarPromocion.setEnabled(false);
        tablaPromocionesEst.clearSelection();
        tablaPromocionEstudiantil.clearSelection();
        tablaPromociones.clearSelection();
        promocionEstudiantilSorter();
    }
    
    private void modoPromocionEstudiantil(){
        cargarPromocionesEst();
        cargarPromocionesEstudiantil();
        seleccionProm=false;
        seleccionEst=false;
        edicionPromocion.setText("Edición: esperando...");
        btnManejoPromociones.setEnabled(true);
        btnPromocionEstudiantil.setEnabled(false);
        btnNuevoPromocion.setEnabled(false);
        btnAgregarPromocion.setEnabled(false);
        btnBusquedaPromocion.setEnabled(false);
        btnEliminarPromocion.setEnabled(false);
        btnCancelarPromocion.setEnabled(false);
        campoCodigoPromocion.setEnabled(false);
        campoCodigoPromocion.setText("");
        campoPromocion.setEnabled(false);
        campoPromocion.setText("");
        btnBusquedaPromocionEstudiantil.setEnabled(true);
        idPromocionSorter();
        tablaPromociones.setVisible(true);
        tablaPromocionesEst.setVisible(true);
        tablaPromocionEstudiantil.setVisible(true);
        tablaPromociones.clearSelection();
    }
    
    
    private void idPromocionSorter(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaPromociones.getModel());
        tablaPromociones.setRowSorter(sorter);
        if(campoCodigoPromocion.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoCodigoPromocion.getText(),0));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
    private void nuevoPromocion(){
        edicionPromocion.setText("Edición: agregar");
        campoCodigoPromocion.setEnabled(true);
        campoCodigoPromocion.requestFocus();
        campoPromocion.setEnabled(true);
        btnNuevoPromocion.setEnabled(false);
        btnBusquedaPromocion.setEnabled(false);
        btnEliminarPromocion.setEnabled(false);
        btnCancelarPromocion.setEnabled(true);
        tablaPromociones.clearSelection();
        tablaPromociones.setRowSelectionAllowed(false);
        unoNadaMas=false;
    }
    
    private void agregarPromocion(){
        
            int confirmado = JOptionPane.showOptionDialog(
                null,"Promoción: "+campoCodigoPromocion.getText()+"-"+campoPromocion.getText()+"\n \nConfirmar creación de promoción", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
            
                    String consultaSQL = "insert into promocion (codigo,nombre) VALUES ("+Integer.parseInt(campoCodigoPromocion.getText())+",'"+campoPromocion.getText()+"')";
                    resultado = sentencia.executeQuery(consultaSQL);

                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        JOptionPane.showMessageDialog(null,"\n ¡Promoción: "+campoCodigoPromocion.getText()+"-"+campoPromocion.getText()+" añadido al sistema!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                        ((DefaultTableModel)tablaPromociones.getModel()).addRow(new Object[]{Integer.parseInt(campoCodigoPromocion.getText()), campoPromocion.getText()});
                        añadidoPromocion();
                    }
                    else{       
                        if(e.getSQLState().equals("23505")){ //unique violation: llave duplicada
                            JOptionPane.showMessageDialog(null, "\n Imposible añadir promoción \n Una promoción con dicho código ya ha sido registrado, por favor asegúrese de ingresar correctamete los datos", "Error", JOptionPane.ERROR_MESSAGE); 
                        }
                        else{
                            JOptionPane.showMessageDialog(null, "\n Imposible añadir promoción \n Por favor ingresar los datos correctamente", "Error", JOptionPane.ERROR_MESSAGE);
                            e.printStackTrace();
                            conexion = null;
                        }
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    
    
    private void eliminarRegistrosPromocion(){
        
            int confirmado = JOptionPane.showOptionDialog(
                null,"Promoción: "+((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 1)).replaceAll("\\s+","")+"-"+tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0)+"\n \nConfirmar eliminación de curso", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
                    String consultaSQL = "delete from promocion where codigo="+tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0);
                    resultado = sentencia.executeQuery(consultaSQL);
                         
                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        int codigo = Integer.parseInt((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0));
                        String promocion = new String(((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 1)).replaceAll("\\s+",""));
                        ((DefaultTableModel)tablaPromociones.getModel()).removeRow(tablaPromociones.convertRowIndexToModel(tablaPromociones.getSelectedRow()));
                        
                        ///eliminar en promocion estudiantil aquellas asociadas
                        JOptionPane.showMessageDialog(null,"\n ¡Promoción "+codigo+"-"+promocion+" eliminado del sistema! \n ¡Promociones de este tipo asociadas a estudiantes serán removidas también!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                        eliminadoPromocion();
                    }
                    else{       
                        JOptionPane.showMessageDialog(null, "\n Imposible eliminar promoción del sistema\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                        e.printStackTrace();
                        conexion = null;
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
    
    private void añadidoPromocion(){
        campoPromocion.setText("");
        campoCodigoPromocion.setText("");
        tablaPromociones.clearSelection();
    }
    
    private void eliminadoPromocion(){
        tablaPromociones.clearSelection();
    }
    
    private void cancelarPromocion(){
        btnNuevoPromocion.setEnabled(true);
        btnBusquedaPromocion.setEnabled(true);
        btnEliminarPromocion.setEnabled(false);
        campoCodigoPromocion.setEnabled(false);
        campoCodigoPromocion.setText("");
        campoPromocion.setEnabled(false);
        campoPromocion.setText("");
        btnCancelarPromocion.setEnabled(false);
        tablaPromociones.clearSelection();
        tablaPromociones.setRowSelectionAllowed(true);
        edicionPromocion.setText("Edición: esperando...");
        idPromocionSorter();
        unoNadaMas=true;
    }
    
    private void buscarPromocion(){
        edicionPromocion.setText("Edición: búsqueda");
        btnNuevoPromocion.setEnabled(false);
        btnCancelarPromocion.setEnabled(true);
        btnBusquedaPromocion.setEnabled(false);
        btnEliminarPromocion.setEnabled(false);
        campoCodigoPromocion.setEnabled(true);
        campoCodigoPromocion.requestFocus();
        tablaPromociones.clearSelection();
    }
    
    private void eliminarPromocion(){
        edicionPromocion.setText("Edición: eliminar");
        btnEliminarPromocion.setEnabled(true);
        campoCodigoPromocion.setEnabled(false);
        campoCodigoPromocion.setText("");
        campoPromocion.setEnabled(false);
        campoPromocion.setText("");
    }
    
    private void puedeEliminarPromocion(){
        if(!btnManejoPromociones.isEnabled()){
            eliminarPromocion();
        }
    }
    
    private void puedeAgregarPromocion(){
        if(!campoPromocion.getText().equals("") && !campoCodigoPromocion.getText().equals("")){
            btnAgregarPromocion.setEnabled(true);
        }
        else{
            btnAgregarPromocion.setEnabled(false);
        }
        
    }
    
    
    private void actualizarControlesPromociones(){
        if(campoPromocion.isEnabled()){
            puedeAgregarPromocion();
        }
    }
    
    
    private void initComponents5(){
        DocumentListener controlCambios = new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent de) {
                actualizarControlesPromociones();
            }

            @Override
            public void removeUpdate(DocumentEvent de) {
                actualizarControlesPromociones();
            }

            @Override
            public void changedUpdate(DocumentEvent de) {
                actualizarControlesPromociones();
            }

        };
        campoPromocion.getDocument().addDocumentListener(controlCambios);
        campoCodigoPromocion.getDocument().addDocumentListener(controlCambios);
        scrollPromocionesBusqueda.getViewport().setBackground(Color.WHITE);
        
        tablaPromociones.addMouseListener(new MouseAdapter() {
                
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 1 && tablaPromociones.getRowSelectionAllowed()) {
                        seleccionProm=true;
                        puedeAsignarPromocion();
                        puedeEliminarPromocion();
                    }
                }
            });
        
        tablaPromocionesEst.addMouseListener(new MouseAdapter() {
                
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 1 && tablaPromocionesEst.getRowSelectionAllowed()) {
                        seleccionEst=true;
                        puedeAsignarPromocion();
                    }
                }
            });
        
        tablaPromocionEstudiantil.addMouseListener(new MouseAdapter() {
                
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 1 && tablaPromocionEstudiantil.getRowSelectionAllowed()) {
                        puedeDesasignarPromocion();
                    }
                }
            });
        
        fechaInicioPromocion.setFieldEditable(false);
        fechaExpiracionPromocion.setFieldEditable(false);
        
        tablaPromociones.setVisible(false);
        tablaPromocionesEst.setVisible(false);
        tablaPromocionEstudiantil.setVisible(false);
        
    }
    
    
    
    private void cargarPromocionesEst(){
        
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[][] estudiantes=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select cedula,nombre,apellido1,apellido2 from estudiante";
            resultado = sentencia.executeQuery(consultaSQL);
            int estudiantesSize=0;
            while(resultado.next()){
                estudiantesSize++;
            }
            
            if(estudiantesSize!=0){
                estudiantes=new Object[estudiantesSize][2];
                estudiantesSize=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                    estudiantes[estudiantesSize][0]=resultado2.getString("cedula").replaceAll("\\s+","");
                    estudiantes[estudiantesSize][1]=resultado2.getString("nombre").replaceAll("\\s+","")+" "+resultado2.getString("apellido1").replaceAll("\\s+","")+" "+resultado2.getString("apellido2").replaceAll("\\s+","");   
                    estudiantesSize++;
                }
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "\n Imposible cargar los estudiantes \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        tablaPromocionesEst.setModel(new javax.swing.table.DefaultTableModel(
            estudiantes,
                
            new String [] {
                "Cédula", "Nombre completo"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });  
        
        scrollPromocionesEstBusqueda.getViewport().setBackground(Color.WHITE);
        tablaPromocionesEst.getColumnModel().getColumn(0).setMaxWidth(95);
        tablaPromocionesEst.getColumnModel().getColumn(0).setMinWidth(95);
    }
    
    private void cargarPromocionesEstudiantil(){
        
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[][] promoEst=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select estudiante,promocion,inicio,expiracion from promocion_estudiantil";
            resultado = sentencia.executeQuery(consultaSQL);
            int promoEstSize=0;
            while(resultado.next()){
                promoEstSize++;
            }
            
            if(promoEstSize!=0){
                promoEst=new Object[promoEstSize][5];
                promoEstSize=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                    promoEst[promoEstSize][0]=resultado2.getString("estudiante").replaceAll("\\s+","");
                    
                    //obtener nombre total al saber la cédula
                    consultaSQL = "select nombre,apellido1,apellido2 from estudiante where cedula='"+promoEst[promoEstSize][0]+"'";
                    Statement sentencia3 = conexion.createStatement();
                    ResultSet resultado3 = sentencia3.executeQuery(consultaSQL);
                    while(resultado3.next()){
                        promoEst[promoEstSize][1]=resultado3.getString("nombre").replaceAll("\\s+","")+" "+resultado3.getString("apellido1").replaceAll("\\s+","")+" "+resultado3.getString("apellido2").replaceAll("\\s+","");   
                    }
                    //
                    
                    //obtener nombre de la promocion al saber el codigo de la misma
                    consultaSQL = "select nombre from promocion where codigo="+resultado2.getString("promocion");
                    Statement sentencia4 = conexion.createStatement();
                    ResultSet resultado4 = sentencia4.executeQuery(consultaSQL);
                    while(resultado4.next()){
                        promoEst[promoEstSize][2]=resultado4.getString("nombre");   
                    }
                    //
                    
                    promoEst[promoEstSize][3]=resultado2.getString("inicio"); 
                    promoEst[promoEstSize][4]=resultado2.getString("expiracion"); 
                    promoEstSize++;
                }
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "\n Imposible cargar las promociones registradas de cada estudiante \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        tablaPromocionEstudiantil.setModel(new javax.swing.table.DefaultTableModel(
            promoEst,
                
            new String [] {
                "Cédula estudiante", "Nombre estudiante", "Promoción", "Desde", "Hasta"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });  
        
        tablaPromocionEstudiantil.getColumnModel().getColumn(0).setMinWidth(107);
        tablaPromocionEstudiantil.getColumnModel().getColumn(0).setMaxWidth(107);
        tablaPromocionEstudiantil.getColumnModel().getColumn(3).setMinWidth(70);
        tablaPromocionEstudiantil.getColumnModel().getColumn(3).setMaxWidth(70);
        tablaPromocionEstudiantil.getColumnModel().getColumn(4).setMinWidth(70);
        tablaPromocionEstudiantil.getColumnModel().getColumn(4).setMaxWidth(70);
        scrollPromocionEstudiantil.getViewport().setBackground(Color.WHITE);
    }
    
    //---------PROMOCION ESTUDIANTIL-----------
    
    private void puedeAsignarPromocion(){
        if(seleccionEst==true&&seleccionProm==true){
            asignarPromocion();
        }
    }
    
    private void asignarPromocion(){
        fechaInicioPromocion.setEnabled(true);
        fechaExpiracionPromocion.setEnabled(true);
        btnCancelarPromocionEstudiantil.setEnabled(true);
    }
    
    private void cancelarPromocionEstudiantil(){
        fechaInicioPromocion.setEnabled(false);
        fechaExpiracionPromocion.setEnabled(false);
        try {
            fechaInicioPromocion.setDate(null);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            fechaExpiracionPromocion.setDate(null);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        }
        btnAsignarPromocion.setEnabled(false);
        btnCancelarPromocionEstudiantil.setEnabled(false);
        btnBusquedaPromocionEstudiantil.setEnabled(true);
        campoBusquedaPromocionEstudiantil.setEnabled(false);
        campoBusquedaPromocionEstudiantil.setText("");
        btnDesasignarPromocion.setEnabled(false);
        tablaPromociones.clearSelection();
        tablaPromocionesEst.clearSelection();
        tablaPromocionEstudiantil.clearSelection();
        seleccionProm=false;
        seleccionEst=false;
        promocionEstudiantilSorter();
    }
    
    private void puedeAsignar2(){
        if(fechaInicioPromocion.getDate()!=null && fechaExpiracionPromocion.getDate()!=null){
            if(fechaInicioPromocion.getDate().compareTo(fechaExpiracionPromocion.getDate())<0){
                btnAsignarPromocion.setEnabled(true);
            }
            else{
                btnAsignarPromocion.setEnabled(false);
                JOptionPane.showMessageDialog(null, "\n La fecha de expiración debe ser mayor que la desde cuando inicia la promoción\n Por favor revisar fechas", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    
    private void añadidoPromocionEstudiantil(){
        seleccionEst=false;
        seleccionProm=false;
        tablaPromociones.clearSelection();
        tablaPromocionesEst.clearSelection();
        fechaInicioPromocion.setEnabled(false);
        try {
            fechaInicioPromocion.setDate(null);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        }
        fechaExpiracionPromocion.setEnabled(false);
        try {
            fechaExpiracionPromocion.setDate(null);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        }
        btnAsignarPromocion.setEnabled(false);
        btnCancelarPromocionEstudiantil.setEnabled(false);
    }
    
    private void eliminadoPromocionEstudiantil(){
        tablaPromocionEstudiantil.clearSelection();
        campoBusquedaPromocionEstudiantil.setText("");
        btnBusquedaPromocionEstudiantil.setEnabled(true);
        campoBusquedaPromocionEstudiantil.setEnabled(true);
        btnDesasignarPromocion.setEnabled(false);
        btnCancelarPromocionEstudiantil.setEnabled(false);
        promocionEstudiantilSorter();
    }
    
    private void agregarPromocionAsignada(){
        int confirmado = JOptionPane.showOptionDialog(
                null,"Promoción "+tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 1)+"\nserá asignada al estudiante "+tablaPromocionesEst.getValueAt(tablaPromocionesEst.getSelectedRow(), 1)+"\n \nConfirmar asignación de promoción", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                PreparedStatement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    String consultaSQL = "insert into promocion_estudiantil (promocion,estudiante,inicio,expiracion) VALUES (?,?,?,?)";                    
                    sentencia = conexion.prepareStatement(consultaSQL);
                    sentencia.setInt(1, Integer.parseInt((String)tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0)));
                    sentencia.setString(2,(String) tablaPromocionesEst.getValueAt(tablaPromocionesEst.getSelectedRow(), 0));
                    sentencia.setDate(3, getInicioDateRevision());
                    sentencia.setDate(4, getExpiracionDateRevision());
                    sentencia.executeUpdate();
                    
                    JOptionPane.showMessageDialog(null,"\n ¡Promoción "+tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 1)+"\nasignada al estudiante "+tablaPromocionesEst.getValueAt(tablaPromocionesEst.getSelectedRow(), 1)+" éxitosamente"
                        + " con validez desde "+obtenerFechaDatePicker(fechaInicioPromocion)+" hasta "+obtenerFechaDatePicker(fechaExpiracionPromocion)+" !","Éxito",JOptionPane.INFORMATION_MESSAGE);
                    
                    ((DefaultTableModel)tablaPromocionEstudiantil.getModel()).addRow(new Object[]{tablaPromocionesEst.getValueAt(tablaPromocionesEst.getSelectedRow(), 0),tablaPromocionesEst.getValueAt(tablaPromocionesEst.getSelectedRow(), 1),tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 1),obtenerFechaDatePicker(fechaInicioPromocion),obtenerFechaDatePicker(fechaExpiracionPromocion)});
                    añadidoPromocionEstudiantil();
                    
                    
                } catch (SQLException e) {
                    JOptionPane.showMessageDialog(null, "\n Imposible añadir promoción asignada al estudiante \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                    conexion = null;
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
    
    private boolean revisarPromocionesDentroRango(){
        
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select estudiante,promocion,inicio,expiracion from promocion_estudiantil where estudiante='"+""+tablaPromocionesEst.getValueAt(tablaPromocionesEst.getSelectedRow(), 0)+"' and promocion="+tablaPromociones.getValueAt(tablaPromociones.getSelectedRow(), 0);
            resultado = sentencia.executeQuery(consultaSQL);
            int promoEstSize=0;
            while(resultado.next()){
                promoEstSize++;
                break;
            }
            
            if(promoEstSize!=0){
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                   SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
                   try {
                       if((formatoFecha.parse(obtenerFechaDatePicker(fechaInicioPromocion))).compareTo(resultado2.getDate("inicio"))>=0 && (formatoFecha.parse(obtenerFechaDatePicker(fechaInicioPromocion))).compareTo(resultado2.getDate("expiracion"))<=0) {
                           return true;
                       }
                       if((formatoFecha.parse(obtenerFechaDatePicker(fechaExpiracionPromocion))).compareTo(resultado2.getDate("inicio"))>=0 && (formatoFecha.parse(obtenerFechaDatePicker(fechaExpiracionPromocion))).compareTo(resultado2.getDate("expiracion"))<=0) {
                           return true;
                       }
                       if((formatoFecha.parse(obtenerFechaDatePicker(fechaInicioPromocion))).compareTo(resultado2.getDate("inicio"))<0 && (formatoFecha.parse(obtenerFechaDatePicker(fechaExpiracionPromocion))).compareTo(resultado2.getDate("expiracion"))>0) {
                           return true;
                       }
                   }catch (ParseException ex) {
                        Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
                   }
                }
                
            }
            else{
                //no hay asi que puede ingresar promociones del estudiante
                return false;
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "\n Imposible cargar las promociones registradas de cada estudiante \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        return false;
    }
    
    private void eliminarPromocionAsignada(){
        int confirmado = JOptionPane.showOptionDialog(
                null,"Promoción "+tablaPromocionEstudiantil.getValueAt(tablaPromocionEstudiantil.getSelectedRow(), 2)+"\nserá desasignada del estudiante "+tablaPromocionEstudiantil.getValueAt(tablaPromocionEstudiantil.getSelectedRow(), 1)+"\n \nConfirmar desasignación de promoción", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                null,    // null para icono por defecto.
                new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                null);
                
            if(confirmado==0){
                Connection conexion=null;
                PreparedStatement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    
                    String consultaSQL = "select codigo from promocion where nombre='"+(String)tablaPromocionEstudiantil.getValueAt(tablaPromocionEstudiantil.getSelectedRow(), 2)+"'";
                    Statement sentencia2 = conexion.createStatement();
                    ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                    
                    
                    consultaSQL = "delete from promocion_estudiantil where estudiante = ? and promocion = ? and inicio =? and expiracion= ?";                    
                    sentencia = conexion.prepareStatement(consultaSQL);
                    
                    sentencia.setString(1, (String)tablaPromocionEstudiantil.getValueAt(tablaPromocionEstudiantil.getSelectedRow(), 0));
                    while(resultado2.next()){
                        sentencia.setInt(2,resultado2.getInt("codigo"));
                        //System.out.print((String)tablaPromocionEstudiantil.getValueAt(tablaPromocionEstudiantil.getSelectedRow(), 0)+"haha"+resultado2.getInt("codigo")+"code");
                    }
                    sentencia.setDate(3, getInicioDateIngreso());
                    sentencia.setDate(4, getExpiracionDateIngreso());//obtener los dates de la tabla
                    sentencia.executeUpdate();
                    
                    JOptionPane.showMessageDialog(null,"\n ¡Promoción desasignada del estudiante exitósamente!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                    
                    ((DefaultTableModel)tablaPromocionEstudiantil.getModel()).removeRow(tablaPromocionEstudiantil.convertRowIndexToModel(tablaPromocionEstudiantil.getSelectedRow()));
                    eliminadoPromocionEstudiantil();
                    
                    
                } catch (SQLException e) {
                    JOptionPane.showMessageDialog(null, "\n Imposible desasignar promoción asignada al estudiante \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                    conexion = null;
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
    
    private void promocionEstudiantilSorter(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaPromocionEstudiantil.getModel());
        tablaPromocionEstudiantil.setRowSorter(sorter);
        if(campoBusquedaPromocionEstudiantil.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoBusquedaPromocionEstudiantil.getText()));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
    private void buscarPromocionEstudiantil(){
        seleccionEst=false;
        seleccionProm=false;
        btnBusquedaPromocionEstudiantil.setEnabled(false);
        campoBusquedaPromocionEstudiantil.setEnabled(true);
        campoBusquedaPromocionEstudiantil.requestFocusInWindow();
        btnCancelarPromocionEstudiantil.setEnabled(true);
        btnAsignarPromocion.setEnabled(false);
        fechaInicioPromocion.setEnabled(false);
        try {
            fechaInicioPromocion.setDate(null);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        }
        fechaExpiracionPromocion.setEnabled(false);
        try {
            fechaExpiracionPromocion.setDate(null);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        }
        tablaPromociones.clearSelection();
        tablaPromocionesEst.clearSelection();
    }
    
    private void puedeDesasignarPromocion(){
        btnDesasignarPromocion.setEnabled(true);
        
    }
    
    private String obtenerFechaDatePicker(DatePicker picker){
        String diaFecha = ""+picker.getDateFormat().getCalendar().get(Calendar.DAY_OF_MONTH);
        if(diaFecha.length()==1){
            diaFecha="0"+diaFecha;
        }
        String mesFecha = ""+(picker.getDateFormat().getCalendar().get(Calendar.MONTH)+1);
        if(mesFecha.length()==1){
            mesFecha="0"+mesFecha;
        }
        return picker.getDateFormat().getCalendar().get(Calendar.YEAR)+"-"+mesFecha+"-"+diaFecha;
    }
    
    private java.sql.Date getInicioDateRevision() {
        
        DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
        java.util.Date parsedUtilDate;  
        java.sql.Date sqltDate=null;
        try {
            parsedUtilDate = df.parse(obtenerFechaDatePicker(fechaInicioPromocion));
            sqltDate= new java.sql.Date(parsedUtilDate.getTime()); 
        } catch (ParseException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        } 
        //java.sql.Date date = java.sql.Date.valueOf(obtenerFechaDatePicker(fechaInicioPromocion));
        //date.
        return sqltDate;
    }
    
    private java.sql.Date getExpiracionDateRevision() {
        DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
        java.util.Date parsedUtilDate;  
        java.sql.Date sqltDate=null;
        try {
            parsedUtilDate = df.parse(obtenerFechaDatePicker(fechaExpiracionPromocion));
            sqltDate= new java.sql.Date(parsedUtilDate.getTime()); 
        } catch (ParseException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        } 
        //java.sql.Date date = java.sql.Date.valueOf(obtenerFechaDatePicker(fechaInicioPromocion));
        //date.
        return sqltDate;
    }
    
    private java.sql.Date getInicioDateIngreso() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        java.sql.Date sqltDate=null;
        try {
            Date date = df.parse((String)tablaPromocionEstudiantil.getValueAt(tablaPromocionEstudiantil.getSelectedRow(),3));
            sqltDate= new java.sql.Date(date.getTime());
        } catch (ParseException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        } 
        //java.sql.Date date = java.sql.Date.valueOf(obtenerFechaDatePicker(fechaInicioPromocion));
        //date.
        return sqltDate;
    }
    
    private java.sql.Date getExpiracionDateIngreso() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        java.sql.Date sqltDate=null;
        try {
            Date date = df.parse((String)tablaPromocionEstudiantil.getValueAt(tablaPromocionEstudiantil.getSelectedRow(),4));
            sqltDate= new java.sql.Date(date.getTime());
        } catch (ParseException ex) {
            Logger.getLogger(VentanaModuloAdministrador.class.getName()).log(Level.SEVERE, null, ex);
        } 
        //java.sql.Date date = java.sql.Date.valueOf(obtenerFechaDatePicker(fechaInicioPromocion));
        //date.
        return sqltDate;
    }
    * */
    
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(VentanaModuloEstudianteEstandar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(VentanaModuloEstudianteEstandar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(VentanaModuloEstudianteEstandar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(VentanaModuloEstudianteEstandar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new VentanaModuloAdministrador().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel astCodigoCurso;
    private javax.swing.JLabel astCodigoPromocion;
    private javax.swing.JLabel astContrasena;
    private javax.swing.JLabel astCurso;
    private javax.swing.JLabel astEstadoCurso;
    private javax.swing.JLabel astEstadoPromocion;
    private javax.swing.JLabel astMontoPromocion;
    private javax.swing.JLabel astNuevaContrasena;
    private javax.swing.JLabel astPromocion;
    private javax.swing.JLabel astRol;
    private javax.swing.JLabel astTipoMonto;
    private javax.swing.JLabel astUsuario;
    private javax.swing.JButton btnActualizar;
    private javax.swing.JButton btnActualizarCurso;
    private javax.swing.JButton btnActualizarMonto;
    private javax.swing.JButton btnActualizarPromocion;
    private javax.swing.JButton btnAgregar;
    private javax.swing.JButton btnAgregarCurso;
    private javax.swing.JButton btnAgregarPromocion;
    private javax.swing.JButton btnAgregarPromocion1;
    private javax.swing.JButton btnAsignarPromocion1;
    private javax.swing.JButton btnAyuda;
    private javax.swing.JButton btnAyudaCurso;
    private javax.swing.JButton btnAyudaMonto;
    private javax.swing.JButton btnAyudaPromocion;
    private javax.swing.JButton btnBusqueda;
    private javax.swing.JButton btnBusquedaCurso;
    private javax.swing.JButton btnBusquedaPromocion;
    private javax.swing.JButton btnBusquedaPromocion1;
    private javax.swing.JButton btnBusquedaPromocionEstudiantil1;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnCancelarCurso;
    private javax.swing.JButton btnCancelarPromocion;
    private javax.swing.JButton btnCancelarPromocion1;
    private javax.swing.JButton btnCancelarPromocionEstudiantil1;
    private javax.swing.JButton btnDesasignarPromocion1;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnEliminarCurso;
    private javax.swing.JButton btnEliminarPromocion;
    private javax.swing.JButton btnEliminarPromocion1;
    private javax.swing.JButton btnManejoPromociones1;
    private javax.swing.JButton btnNuevo;
    private javax.swing.JButton btnNuevoCurso;
    private javax.swing.JButton btnNuevoPromocion;
    private javax.swing.JButton btnNuevoPromocion1;
    private javax.swing.JButton btnPromocionEstudiantil1;
    private javax.swing.JTextField campoActualizarMonto;
    private javax.swing.JTextField campoBusquedaPromocionEstudiantil1;
    private javax.swing.JTextField campoCodigoCurso;
    private javax.swing.JTextField campoCodigoPromocion;
    private javax.swing.JTextField campoCodigoPromocion1;
    private javax.swing.JPasswordField campoContrasena;
    private javax.swing.JTextField campoCurso;
    private javax.swing.JTextField campoId;
    private javax.swing.JTextField campoMontoPromocion;
    private javax.swing.JPasswordField campoNuevaContrasena;
    private javax.swing.JTextField campoPromocion;
    private javax.swing.JTextField campoPromocion1;
    private javax.swing.JLabel cerrarSesion;
    private javax.swing.JRadioButton checkDigitado;
    private javax.swing.JRadioButton checkTotal;
    private javax.swing.JLabel codigoCurso;
    private javax.swing.JLabel codigoPromocion;
    private javax.swing.JLabel codigoPromocion1;
    private javax.swing.JLabel contrasena;
    private javax.swing.JLabel curso;
    private javax.swing.JLabel edicion;
    private javax.swing.JLabel edicionCurso;
    private javax.swing.JLabel edicionPromocion;
    private javax.swing.JLabel edicionPromocion1;
    private javax.swing.JRadioButton estadoActivo;
    private javax.swing.JRadioButton estadoActivoPromocion;
    private javax.swing.JLabel estadoCurso;
    private javax.swing.JRadioButton estadoDesactivo;
    private javax.swing.JRadioButton estadoDesactivoPromocion;
    private javax.swing.JLabel estadoPromocion;
    private com.michaelbaranov.microba.calendar.DatePicker fechaExpiracionPromocion1;
    private com.michaelbaranov.microba.calendar.DatePicker fechaInicioPromocion1;
    private javax.swing.ButtonGroup grupoTipoMonto;
    private javax.swing.JLabel id;
    private javax.swing.JLabel imgCurso;
    private javax.swing.JLabel imgPromocion;
    private javax.swing.JLabel imgPromocion1;
    private javax.swing.JLabel imgUsuario;
    private javax.swing.JLabel inicioPromocion2;
    private javax.swing.JLabel inicioPromocion3;
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel manejoCursos;
    private javax.swing.JPanel manejoCursos2;
    private javax.swing.JPanel manejoPromociones;
    private javax.swing.JPanel manejoUsuarios;
    private javax.swing.JLabel modulo;
    private javax.swing.JLabel monto;
    private javax.swing.JLabel nuevaContrasena;
    private javax.swing.JPanel panelCursos;
    private org.edisoncor.gui.panel.PanelImage panelImagenEstudiante;
    private org.edisoncor.gui.panel.PanelImage panelImagenEstudiante2;
    private javax.swing.JPanel panelModalidadPromociones1;
    private javax.swing.JPanel panelMontos;
    private javax.swing.JTabbedPane panelOpciones;
    private javax.swing.JPanel panelPromocionEstudiantil1;
    private javax.swing.JPanel panelPromociones;
    private javax.swing.JPanel panelPromociones1;
    private javax.swing.JPanel panelUsuarios;
    private javax.swing.JLabel perfil;
    private javax.swing.JLabel promocion;
    private javax.swing.JLabel promocion1;
    private javax.swing.JLabel registrado;
    private javax.swing.JRadioButton rolAdmin;
    private javax.swing.JRadioButton rolEstandar;
    private javax.swing.JLabel roles;
    private javax.swing.JScrollPane scrollCursosBusqueda;
    private javax.swing.JScrollPane scrollMontosBusqueda;
    private javax.swing.JScrollPane scrollPromocionEstudiantil1;
    private javax.swing.JScrollPane scrollPromociones;
    private javax.swing.JScrollPane scrollPromocionesBusqueda1;
    private javax.swing.JScrollPane scrollPromocionesEstBusqueda1;
    private javax.swing.JScrollPane scrollUsuariosBusqueda;
    private javax.swing.JTable tablaCursos;
    private javax.swing.JTable tablaMontos;
    private javax.swing.JTable tablaPromocionEstudiantil1;
    private javax.swing.JTable tablaPromociones;
    private javax.swing.JTable tablaPromociones1;
    private javax.swing.JTable tablaPromocionesEst1;
    private javax.swing.JTable tablaUsuarios;
    private javax.swing.JLabel tipoMonto;
    private javax.swing.JLabel usuario;
    private javax.swing.JLabel version;
    // End of variables declaration//GEN-END:variables
    private static final String cadenaConexion = "jdbc:postgresql://localhost/SMAAMDB?" + "user=postgres&password=root";
    private static final String msjLetras = "Sólo letras";
    private static final String msjNumeros = "Sólo números";
    private static final String patronEmail = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    private boolean unoNadaMas; //en estado nuevo no puede hacer sort... solo en busqueda. Bit sucio
    private boolean seleccionEst;
    private boolean seleccionProm;
    
    /*
    Comienzo del patrón
^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$;
Caracteres por los que puede comenzar la dirección del correo electrónico
^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$;
Caracteres opcionales.
^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$;
La dirección de correo debe contener el símbolo @
^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$;
El nombre del dominio del correo debe comenzar por estos caracteres
^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$;
El primer dominio de nivel superior o TLD debe de comenzar por punto seguido por los caracteres resaltados
^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$;
El primer nivel TLD puede ir seguido opcionalmente por un segundo nivel TLD que debe ser de tener 2 o más caracteres
^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$;
     */

    @Override
    public void update(Observable o, Object arg) {
        actualizarControles();
    }

     private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
       ModuloAlertas alertas = new ModuloAlertas();
       alertas.setActual(cerrarSesion.getText());
       alertas.setVisible(true);
        this.dispose();
    }
}
